设计模式

来源:互联网 发布:阿里云maven镜像配置 编辑:程序博客网 时间:2024/06/06 01:25
我自己看的
我认为很多设计模式看起来和java不同的最主要问题是PHP是弱类型,体现不出那些包含原始类的那种情况。

1、创建型模式:
单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、创建者模式、原型模式。
参考:http://www.thinkphp.cn/topic/14357.html
2、结构型模式:
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
参考:http://www.thinkphp.cn/topic/14422.html
3、行为型模式:
模版模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

参考:http://www.thinkphp.cn/topic/14517.html
还有一些类似于MVC模式等等。

 工厂模式
众多子类并且会扩充、创建方法比较复杂。
1.简单工厂模式:通过你输入的数据来判断你想要新建哪个类。这样把所有的类都放在工厂类中,在之后的实现中,都是实现工厂类。修改的时候只修改工厂类就可以了。
class Simplefactory{public static function fun($flag){if($flag==1){return new Teacher();}if($flag==2){return new Student();}}}
调用如下所示,实现了实例化Teacher类。
$a=Simplefactory::fun(1);
通过调用工厂类的函数来新建对象,这样就不用new了。
但是:当需要添加新产品时,也需要修改工厂代码。

2.工厂方法模式:只有一条产品线,模式只负责抽象工厂接口,具体工厂交给客户去扩展。
interface CommonFactory{   public function getProduct();}class Product1Factory{   function getProduct(){    return new Product1();   }}class Product2Factory{   function getProduct(){    return new Product2();   }}
调用如下所示,实现了实例化Product1类。
$a=new Product1Factory();return $a->getProduct();

3.抽象工厂模式:有多条产品线,是对工厂方法的扩展。
interface CommonFactory{     public function getProduct();     public function getPerson();  }  class Product1Person1Factory{     function getProduct(){      return new Product1();     }     function getPerson(){    return new Person1();   }}  class Product2Person2Factory{     function getProduct(){      return new Product2();     }     function getPerson(){    return new Person2();   }}  


调用如下所示,实现了实例化Product1类和Person1类。
$a=new Product1Person1Factory();echo $a->getProduct();
echo $a->getPerson();

4.单例模式

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。


数据库连接、缓存操作、分布式存储
只把这个类新建一次,然后之后再都调用这个对象,不再新建。用到最多的就是数据库连接。这个对象我们使用类的内部全局静态变量,对这个进行判断,为空则新建实例,不为空则结束。
<?phpclass Single{private $name;private function __construct(){}public static $initialize;public static function GetInitialize(){if(is_null(self::$initialize)){self::$initialize=new self();print "haha";}return self::$initialize;}}$a=Single::GetInitialize();$b=Single::GetInitialize();?>
5.创建者模式
创建非常复杂,分步骤组装起来。内部数据复杂,经过封装之后对外简单了。
比如说购物车中有两个部分,商品和购物券
如果关掉了网页,再次打开,根据cookie还原,也就是说要根据cookie中的信息,重建一个购物车实例。
无非就是新建一个购物车实例,再读取cookie中的数据然后调用添加的方法(多个添加方法,这里举例是两个)一个个添加进去。从而实现。
创建者模式就是将这个过程变为一个类,类中的函数实现添加的过程。从而新建这个类,调用这个函数实现上面的过程。

6.原型模式
原型模式本身就是用来解决系统中需要创建一个新对象,而要创建的对象和系统中已有对象存在诸多重复的属性和方法,如果再去new一个新的空对象,就需要对新的对象进行赋值初始化操作,这会增加不必要的工作量。
将一个对象作为原型,进行复制和克隆,产生一个和原对象类似的新对象。
在类中多加一个克隆函数
例如function copy(){return clone $this;}

7.适配器模式
就是你的接口和别人需要的接口对不上,这个时候需要中间加一个转换的部分来实现这个接口的转换。
应用场景:老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类库。

8.桥接模式
将抽象化和实现化解耦,使得二者可以独立变化。应用:需要不断更换调用对象却执行相同的调用方法,实现扩展功能
比如说有小汽车和大汽车两种汽车,有市区路和高速路两种路,把他们匹配为什么汽车在什么路上跑。
一般情况下是,建立路的类,再建立什么汽车在什么路上跑的类。
桥接模式是建立路的类,再建立汽车的类,然后桥接,比如说要输出什么汽车在什么路上跑
路类的fun输出什么路,汽车类的fun输出什么车,那么就在路类中引入汽车基类,并且在路类中调用汽车类的方法。

9.装饰模式
动态地给一个对象添加额外的职责。在原有的基础上进行功能增强,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,持有这个实例之后呢,就可以调用原来的函数然后再加上新的功能,从而共同构成一个函数,ok结束应用:用于需要对原有对象增加功能而不是完全覆盖的时候。

10.组合模式(不太懂)
将对象组合成树形结构表示“部分-整体”的层次结构。常用于表示树形结构中,例如二叉树,数等

11.外观模式(门面模式)
为了系统中的一组接口提供一个一致的界面。应用:内部接口众多,由统一的接口来调用
例如:用一个接口,一下调用一组接口。

12.代理模式
代理模式就是多一个代理类出来,替原对象进行一些操作。能够协调调用者和被调用者,能够在一定程度上降低系统的耦合性。应用:客户访问不到或者被访问者希望隐藏自己,所以通过代理来访问自己。
将这个原始类的数据和方法,都在代理类中再实现一遍,这样别人通过代理类来获取原始类的数据。

13.享元模式
采用一个共享来避免大量有相同内容对象的开销。这种开销中最直观的就是内存的损耗。
应用:系统底层的设计。例如字符串的创建。如果两个字符串相同,则不会创建第二个字符串,而是第二个的引用直接指向第一个字符串。$str1=”abc”,$str2=”abc”.则内存存储中只会创建一个字符串“abc”而引用$str1.$str2都会指向它。

14.模板模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
例如,在抽象类中有一个函数1调用了另一个函数2,在子类中重写了被调用的函数2,实例化的时候调用抽象类的函数1来实现重写的函数2.

15.命令模式 
就是根据命令来建类。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。例如司令类获得一个命令类,然后再执行一个方法,找到小兵类,执行小兵类中的方法,从而获得结果。

16.迭代器模式
用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。用一个类来获取这个集合的前一个后一个和当前的元素,具体怎么获取这个集合对象的元素,在这个类中定义好即可。

17.观察者模式
对象之间存在一对多时,观察者就是看着别人的状态那个,被观察者就是被观察的那个,他的状态变化了,观察者的状态也要跟着变化。

18.中介者模式
用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。应用场景:不需要显示地建立交互。
具体类中有中介者类,这样可以使用中介者的信息。中介者中有具体的类,这样可以获取信息。

19.状态模式
创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。例如根据不同的状态码采取不同的操作。

20.责任链模式
为请求创建了一个接收者对象的链。例如:你请短假,找小领导请假,请长假,就要找大领导。对请求的发送者和接收者进行解耦。对接收对象建立多个类。确定好找谁解决。

21.策略模式
不同的策略,创建各种策略的类,一个行为随着策略对象的改变而改变策略。选择策略类中根据策略对象的不同采取不同的方法。

22.备忘录模式
主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。

23.解释器模式
定义语言的文法,并建立一个解释器解释该语言中的句子。每个用过 字典的童鞋都懂滴。

24.访问者模式
封装某些用于作用于某种数据结构中各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新操作。
元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
如银行排号机。应用:排队


原创粉丝点击