享元模式

目录 设计模式

享元模式属于结构型模式
概述:运用共享技术有效地支持大量细粒度的对象
享元模式:
运用共享技术有效的支持大量细粒度的对象
享元模式变化的是对象的存储开销

享元模式中主要角色:

抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外运状态的操作可以通过调用商业以参数形式传入
具体享元(ConcreteFlyweight)角色:实现Flyweight接口,并为内部状态(如果有的话)拉回存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的
不共享的具体享元(UnsharedConcreteFlyweight)角色:并非所有的Flyweight子类都需要被共享。Flyweigth使共享成为可能,但它并不强制共享

享元工厂(FlyweightFactory)角色:负责创建和管理享元角色。本角色必须保证享元对象可能被系统适当地共享
客户端(Client)角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外部状态
享元模式的优点:
Flyweight模式可以大幅度地降低内存中对象的数量
享元模式的缺点:
Flyweight模式使得系统更加复杂
Flyweight模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长
享元模式适用场景:
当一下情况成立时使用Flyweight模式:
1 一个应用程序使用了大量的对象
2 完全由于使用大量的对象,造成很大的存储开销
3 对象的大多数状态都可变为外部状态
4 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
5 应用程序不依赖于对象标识
享元模式与其它模式:

单例模式(Singleton):客户端要引用享元对象,是通过工厂对象创建或者获得的,客户端每次引用一个享元对象,都是可以通过同一个工厂对象来引用所需要的享元对象。因此,可以将享元工厂设计成单例模式,这样就可以保证客户端只引用一个工厂实例。因为所有的享元对象都是由一个工厂对象统一管理的,所以在客户端没有必要引用多个工厂对象。不管是单纯享元模式还是复合享元模式中的享元工厂角色,都可以设计成为单例模式,对于结果是不会有任何影响的。

Composite模式:复合享元模式实际上是单纯享元模式与合成模式的组合。单纯享元对象可以作为树叶对象来讲,是可以共享的,而复合享元对象可以作为树枝对象,因此在复合享元角色中可以添加聚集管理方法
继续阅读 “享元模式”

组合模式

目录 设计模式

组合模式属于结构型模式
概述:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合和聚合都描述一个类长期持有其他类的一个或多个实例的情况。
聚合:被包含对象是容器的核心部分,但是他们也可以被其他对象所包含。聚合关系用一条以空心菱形开头的线来说明。
组合:被包含的对象只能被它的容器所引用。当容器被删除时,它也应该被删除。组合关系的菱形是实心的

<?php 
/**
 * 执行单元
 */
abstract class Unit{
    
    public function bombardStrength();
    
}
<?php 
/**
 * 弓箭手
 */
class ArcherUnit extends Unit{
    
    public function bombardStrength(){
        
        return 4;
    }
}
<?php 
/**
 * 激光大炮
 */
class LaserCannonUnit extends Unit{
    
    public function bombardStrength(){
        
        return 10;
    }
}
<?php 
/**
 * 军队
 */
class Arm{
    
    private $units = array();
    private $strength = 0;
    public function addUnit(Unit $unit){
        
        array_push($this->units, $unit);
        
    }
    
    public function bombardStrength(){
        
        foreach ($this->units as $unit){
            
            $this->strength += $unit->bombardStrength();
        }
        
    }
}
<?php
 /**
 * 组合模式
 */
public function actionCombine(){
    
    $archer = new ArcherUnit;
    $laserCannon = new LaserCannonUnit;
    
    $arm = new Arm;
    $arm->addUnit($archer);
    $arm->addUnit($laserCannon);
    
    echo $arm->bombardStrength();
}

建造者模式

目录 设计模式

建造者模式属于创建型模式
概述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
优点:
建造者模式可以很好的将一个对象的实现与相关的‘业务’逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易

缺点:
建造者接口的修改会导致所有执行类的修改
以下情况应该使用建造者:
1 需要生成的产品对象有复杂的内部结构
2 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
3 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品的创建过程中不易得到

使用建造者模式主要有一下效果:
1 建造者模式的使用使得产品的内部表象可以独立的变化,使用建造者模式可以使客户端不必知道产品内部组成的细节
2 每一个Builder都相对独立,而与其他的Builder无关
3 模式所建造的最终产品更易于控制
继续阅读 “建造者模式”

状态模式

目录 设计模式

状态模式属于行为型模式
概述:允许一个对象在其内部状态改变时改变它的行为, 对象看起来似乎修改了它所属的类
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类

状态state模式是GOF23种模式中的一种,和命令模式一样,也是一种行为模式。状态模式和命令模式相当像,一样是“接口—实现类”这种模式的应用,是面向接口编程原则的体现。

状态模式属于对象创建型模式,其意图是允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类。比较常见的例子是在一个表示网络连接的类TCPConnection,一个TCPConnection对象的状态处于若干不同的状态之一:连接已经建立(Established),正在监听,连接已经关闭(closed)。当一个TCPConnection对象收到其他对象的请求时,他根据自身的状态作出不同的反应。

例如:一个Open请求的结果依赖于该连接已关闭还是连接已建立状态。State模式描述了TCPConnection如何在每一种状态下表现出不同的行为。这一种模式的关键思想是引入了一个称为TCPState的抽象类表示网络的连接状态,TCPState类为各种表示不同的操作状态的字类声明了一个公共接口。TCPState的子类实现与特定的状态相关的行为。例如,TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。

举例来说:一个人具有生气,高兴和抓狂等状态,在这些状态下做同一个事情可能会有不同的结果,一个人的心情可能在这三种状态中循环转变。使用一个moodState类表示一个人的心情,使用mad,Happy,Angry类代表不同的心情
继续阅读 “状态模式”

职责链模式

目录 设计模式

职责链模式属于行为型模式
概述:为解除请求的发送者和接收者之间的耦合, 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它, 而使用多个对象都用机会处理这个请求

<?php
/**
 *职责链抽象类
 */
abstract class Chain{
    public $chain;
    public function setChain($chain){
        $this->chain = $chain;
    }
    public function handleRequest($request){}
}
<?php
/**
 *职责链一号
 *计算值是否为0
 */
class ChainZero extends Chain{
    public function handleRequest($num){
        if($num == 0){
            echo '此数为0 职责链停止<br/>';
        }else{
            echo 'zero<br/>';
            $this->chain->handleRequest($num);
        }
    }
}
<?php
/**
 *职责链一号
 *计算值是否为奇数
 */
class ChainEven extends Chain{
    public function handleRequest($num){
        if($num%2 == 1){
            echo '此数为奇数 职责链停止<br/>';
        }else{
            echo 'even<br/>';
            $this->chain->handleRequest($num);
        }
    }
}
<?php
/**
 *职责链一号
 *计算值是否为偶数
 */
class ChainOdd extends Chain{
    public function handleRequest($num){
        if($num%2 != 1){
            echo '此数为偶数 职责链停止<br/>';
        }else{
            echo 'odd<br/>';
            $this->chain->handleRequest($num);
        }
    }
}
<?php
 /**
 *职责链模式
 */
public function actionChain(){

    Yii::import('ext.chain.*');
    $chainZero = new ChainZero();
    $chainEven = new ChainEven();
    $chainOdd = new ChainOdd();
    $chainZero->setChain($chainEven);
    $chainEven->setChain($chainOdd);
    foreach(array(2,3,4,5,0) as $num)
    {
        $chainZero->handleRequest($num);
    }
}

模版模式

目录 设计模式

模版模式属于行为型模式
概述:定义一个操作的算法骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

<?php
/**
 *模版模式基类
 */
abstract class Template{
    public function templateA(){}
    public function templateB(){}
    public function getTemplate(){
       
        $this->templateA();
        $this->templateB();
   
    }
}
<?php
/**
 * 子类
 */
class TemplateChild extends Template{
    public function templateA(){
   
        echo 'A';
    }
    public function templateB(){
   
        echo 'B';
    }
}
<?php
 /**
 *模版方法
 */
public function actionTemplate(){

 Yii::import('ext.template.*');
    $templateC = new TemplateChild;
    $templateC->getTemplate();
}

观察者模式

目录 设计模式

观察者模式属于行为型模式
概述:观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象(主体)的状态发生改变时,所有依赖它的对象(观察者)都得到通知并自动更新
它完美的将观察者对象和被观察者对象分离。可以在独立的对象(主体)中维护一个对主题感兴趣的依赖项(观察者)列表。让所有观察者各自实现公共的Observer接口,以取消主体和依赖项的直接依赖关系。
继续阅读 “观察者模式”

命令模式

目录 设计模式

命令模式属于行为型模式
概述:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分开,委派 给不同的对象。

请求的一方发出请求要求执行一个操作;接受的一方受到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收的一方的接口,更 不必知道请求是怎么被接收的,以及操作是否被执行、何时被执行,以及是怎么被执行的。

命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。
具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现Execute()方法, 负责调用接收者的相应操作。Execute()方法通常叫做执行方法。
客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者, 实施和执行请求的方法叫做行动方法。
继续阅读 “命令模式”

策略模式

目录 设计模式

策略模式属于行为型模式
概述:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户
策略模式:
定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户

封装:
把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中取出来,用接口进行单独的封装。
互相替换:我们封装好了接口,通过指定不同的接口实现类进行算法的变化。
继续阅读 “策略模式”