打算复习下设计模式,就有了这个文集。
所谓设计模式,就是代码编程里面的一种套路,解决某类问题形成的套路模式,就好比你去撩妹,啥都不会,话不会说,也不知道接下来该怎么样。而像情圣,就会告诉你,撩妹,应该先弄到微信号,然后请吃饭,再看电影。这个流程大体上是固定而细节上又是灵活的。这就是套路。
java的设计模式和php的不太一样,当然,思想是一样的,但是由于php很灵活,没有多态的特性,所以很多java的设计模式没法套,所以自己整理下。
如果是java,以下是常见多态例子思想。
一个简单的函数调用,go函数传入一个cat类的实例,go函数内部调用了cat类的run方法
public class Test {
public static void main(String[] args) {
go(new Cat ());
}
public static void go(Cat cat)
{
cat.run();
}
}
class Cat
{
public void run()
{
System.out.println("猫在叫");
}
}
这个时候我们加入一个狗类,Dog类,希望go函数也能调用狗类的run方法,理论上也可以,但是会比较复杂,而且如果随着类加入的越多,要添加的go函数也会越多
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
go(new Cat());
go(new Dog());
}
public static void go(Cat cat)
{
cat.run();
}
public static void go(Dog dog)
{
dog.run();
}
}
class Cat
{
public void run()
{
System.out.println("猫在叫");
}
}
class Dog
{
public void run()
{
System.out.println("狗在叫");
}
}
代码量无限增多会导致代码复杂度上升,而且不好修改,所以我们希望有那么一种方式,可以在少量添加代码的情况下,又能根据new出来的实例去自动调用实例化类内部的方法。我们可以是使用继承的方式实现这种情况,go函数的形参传的是父类,子类则为实参,这样,就可以根据子类的具体的对象调用具体的函数。这种情况称之为“父类的引用指向子类的对象”,
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
go(new Animal());
go(new Cat());
go(new Dog());
}
public static void go(Animal animal)
{
animal.run();
}
}
class Animal
{
public void run()
{
System.out.println("动物在叫");
}
}
class Cat extends Animal
{
public void run()
{
System.out.println("猫在叫");
}
}
class Dog extends Animal
{
public void run()
{
System.out.println("狗在叫");
}
}
这是java的情况,由于java是强类型的,他不得不使用这种方式进行设计实现想要的结果,这种实现基本上贯穿了java的整个开发体系,所以java23种设计模式中,很多都是涉及到这块,那么,现在来看看php的。如果是php实现会怎么样?
function go($animal)
{
echo $animal->run();
}
go(new Dog());
echo '<br>';
go(new Cat());
class Animal
{
public function run()
{
echo '动物在叫';
}
}
class Cat
{
public function run()
{
echo '猫在叫';
}
}
class Dog
{
public function run()
{
echo '狗在叫';
}
}
可以看得出来php实现起来会更灵活,写到这里只是想说java的设计模式不能照搬到php,不过大体上还是很相似的