解释器模式

目录 设计模式

解释器模式属于行为型模式
概述:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子
解释器模式的优缺点:
解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。 但是,解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。同时,由于采用递归调用方法,每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,必须通过递归方式,无论是面向对象的语言还是面向过程的语言,递归都是一个不推荐的方式。由于使用了大量的循环和递归,效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。

<?php
class Expression
{
 function interpreter($str)
 {
  return $str;
 }
}
<?php
class ExpressionNum extends Expression
{
 function interpreter($str)
 {
  switch($str)
  {
   case "0": return "零";
   case "1": return "一";
   case "2": return "二";
   case "3": return "三";
   case "4": return "四";
   case "5": return "五";
   case "6": return "六";
   case "7": return "七";
   case "8": return "八";
   case "9": return "九";
  }
 }
}

继续阅读 “解释器模式”

中介者模式

目录 设计模式

中介者模式属于行为型模式
概述:使各对象不需要显式地相互引用从而使其耦合松散, 用一个中介对象来封装一系列的对象交互, 而且可以独立地改变它们之间的交互
使用中介者模式的场合和优缺点

使用终结者模式的场合

1.一组定义良好的对象,现在要进行复杂的通信。

2.定制一个分布在多个类中的行为,而又不想生成太多的子类。

可以看出,中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。呵呵~~~

使用中介者模式的优点:

1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。

2.提高系统的灵活性,使得系统易于扩展和维护。

使用中介者模式的缺点:

中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。
继续阅读 “中介者模式”

迭代器模式

目录 设计模式

迭代器模式属于行为型模式
概述:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
个人举例:
1.公交买票
2.php foreach
3 python iter

<?php
namespace haibao\design\web\view\design;
use haibao\design\web\common\design\iterator\Bus;
use haibao\design\web\common\design\iterator\Conductor;

class Iterator extends \haibao\design\web\view\Base{
    protected function preRender(){

        header("Content-type: text/html; charset=utf-8");
           $bus = new Bus();
           $bus->add('大鸟');
           $bus->add('小菜');
           $bus->add('行李');
           $bus->add('老外');
           $bus->add('公交内部员工');
           $bus->add('小偷');
           $conductor = $bus->createConductor();
           //$conductor = new Conductor($bus);
           
        $conductor->first();
        while(!($conductor->isDone())){
        
            echo $conductor->currentItem().' 请买票<br/>';
            echo $conductor->second();
        }
    }
}

继续阅读 “迭代器模式”

备忘录模式

目录 设计模式

备忘录模式属于行为型模式,何为行为型模式,即行为型模式设计到算法和对象间的职责分配,不仅描述对象或类的模式,还描述它们之间的通信方式,刻划了运行时难以跟踪的复杂的控制流,它们将你的注意力从控制流转移到对象间的关系上来。行为型类模式采用继承机制在类间分派行为
概述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可将该对象恢复到原先保存的状态
个人举例:
1 看书的书签
2 消息盒子

<?php
/**
 * 发起角色
 * 备忘录角色
 * 管理备忘录角色
 */

namespace haibao\design\web\view\design;
use haibao\design\web\common\design\memento\Originator;
use haibao\design\web\common\design\memento\Caretaker;

class Memento extends \haibao\design\web\view\Base{
    protected function preRender(){

        header("Content-type: text/html; charset=utf-8");
           $originator = new Originator();
           $originator->state = "ON";
           $originator->show();
           
           $caretaker = new Caretaker();
           $caretaker->setMemento($originator->createMemento());
           
           $originator->state = "OFF";
           $originator->show();
           
           $originator->setMemento($caretaker->getMemento());
           $originator->show();
    }
}

继续阅读 “备忘录模式”

代理模式

目录 设计模式

代理模式属于结构型模式
概述:为其他对象提供一种代理以控制对这个对象的访问
代理模式:
为其他对象提供一种代理以控制对这个对象的访问
代理模式使用场合:

第一种:远程代理,就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
第二种:虚拟代理,·根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
第三种:安全代理,用来控制真实对象访问时的权限
第四种:智能指引,是指当调用真实的对象时,代理处理另外一些事

个人举例:
谈恋爱送花
继续阅读 “代理模式”

装饰模式

目录 设计模式

装饰模式属于结构型模式
概述:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
装饰者模式:
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案
装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责。这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

装饰模式中主要角色:
抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。
具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。

装饰模式的优点:
1、比静态继承更灵活;
2、避免在层次结构高层的类有太多的特征

装饰模式的缺点:
1、使用装饰模式会产生比使用继承关系更多的对象。并且这些对象看上去都很想像,从而使得查错变得困难。

装饰模式适用场景:
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤消的职责,即需要动态的给一个对象添加功能并且这些功能是可以动态的撤消的。
3、当不能彩生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

个人举例:
田老师点餐
装饰模式 一种算法 链表
继续阅读 “装饰模式”

外观模式

目录 设计模式

外观模式属于结构型模式
概述:为子系统中的一组接口提供一个一致的界面,此模式定义一个高层接口,这个接口使得这一子系统更加容易使用
外观模式就是让client客户端以一种简单的方式来调用比较复杂的系统来完成一件事情;

目的:
1. 为一个复杂子系统提供简单的接口
2. 减少客户端和子系统的耦合

个人举例:
1 购买手抓饼

<?php
namespace haibao\design\web\view\design;
use haibao\design\web\common\design\adapter\Translator;
class Facade extends \haibao\design\web\view\Base{
    protected function preRender(){

        header("Content-type: text/html; charset=utf-8");
        $facade = new \haibao\design\web\common\design\facade\Facade();
        $facade->facade1();
        echo '<hr />';
        $facade->facade2();
    }
}

继续阅读 “外观模式”

适配器模式

目录 设计模式

适配器模式属于结构型模式
概述:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本的由于接口不兼容而不能一起工作的那些类可以一起工作
使用前提:
适配器中主要角色
目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所希望得到的
源(Adaptee)角色:需要进行适配的接口
适配器(Adapter)角色:対Adaptee的接口与Target的接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类

适配器使用场景
1、你想使用一个已经存在的类,而它的接口不符合你的需求
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口,对象适配器可以适配他的父类接口(仅限于对象适配器)

个人举例:
1 姚明在NBA打球,但是不懂英语,需要一个翻译进行翻译之后才能懂得战术
2 苹果手机使用安卓手机的充电线
继续阅读 “适配器模式”

桥接模式

目录 设计模式

桥接模式属于结构型模式,何为结构型模式,即结构型设计模式是从程序的结构上解决模块之间的耦合问题(低耦合)
概述:将抽象部分与它的实现部分分离,使他们都可以独立的变化
桥接模式:
将抽象部分与它的实现部分分离,使他们都可以独立的变
抽象与它的实现分离,即抽象类和它的派生类用来实现自己的对象

桥接与适配器模式的关系(适配器模式后面讲解)
桥接属于聚合关系,两者关联 但不继承
适配器属于组合关系,适配者需要继承源

聚合关系:A对象可以包含B对象 但B对象不是A对象的一部分
个人举例:
1 大雁和雁群
2 手机软件和手机品牌功能
组成关系:
鸟和翅膀的关系

继续阅读 “桥接模式”