145 php 设计模式代码和应用场景实例

设计模式代码和应用场景实例


behavioral


templete(模板方法模式)

需求:某个方法的实现需要多个步骤(类似“请客”),其中有些步骤是固定的(类似“点单”和“买单”),而有些步骤并不固定,存在可变性(类似“吃东西”)。
注意点: 钩子方法有两类:第一类钩子方法可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的,这类方法名一般为IsXXX(),如果条件满足则执行某一步骤,否则将不执行.还有一类钩子方法就是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法

creational


structural


Adapter(适配器模式)

需求:因为老系统改造需要重写用户类,但是新的用户类接口要和原有用户类接口不兼容,需要用新类的接口封装原有的接口
注意点:旧的对象通过成员变量方式传入,这里使用组合模式(有统一的生存期,实心菱形)解耦,也可以使用继承,但是耦合度太高
<?php 
//旧用户类
class User {
    // error_此处是private 用户名唯一 
    private $name;
    //是否是protected? 不是 
    //error_  此处双下划线 
    //error_ 构造函数传入用户名
    function __construct($name){
        $this -> name = $name;
    }
    public function getName(){
        return $this -> name;
    }
}

//error_ 此处需要用抽象类
interface UserInterface{
    function getUserName();
}

//error_ 此处继承接口
class UserInfo Implements UserInterface {
    // error_ 此处成员变量名是user
    protected $user;
    function __construct($user){
        $this -> user = $user;
    }
    //error_ 此处不需要传入参数$user
    public function getUserName(){
        return $this -> user -> getName();
    }
}

$oldUser = new User();
echo "old_user_name =".$oldUser -> getName();
$newUser = new UserInterface($oldUser);
//error_ 此处不需要传入参数$oldUser
echo "still_old_user_name =".$newUser -> getUserName();

Bridge(桥接模式)

需求:你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。
注意点:一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。在有多种可能会变化的情况下,用继承会造成类爆炸问题.
<?php 
/**
 *  workshop有两个行为子类 assemble 和 produce
 *  vehicel  有两个子类 car 和 motorcycle
 */
interface Workshop {
    //error_ 接口函数为空则不需要大括号
    function work();
}

interface Vehicle {
    protected $workshop1;
    protected $workshop2;

    function __construct( Workshop $workshop1 , Workshop $workshop2){
        $this -> workshop1 = $workshop1;
        $this -> workshop1 = $workshop2;
    }

    function manufacture(){
        $this -> workshop1 ->work();
        $this -> workshop2 ->work();
    }
}

class Assemble implements Workshop{
    public function work(){
        echo "assembled"            ;
    }
}

class Produce implements Workshop{
    public function work(){
        echo "Produced"            ;
    }
}

// error_ 此处用extends继承
class Car extends Vehicle{
    //error_ 此处无需再次声明成员变量
    // protected $workshop1;
    // protected $workshop2;

    //error_ 此处沿用父类写法 对象类型+对象名
    function __construct ( Workshop $workShop1, Workshop $workShop2){
        //error_ 此处使用父类方法
        parent::__construct ( $workShop1, $workShop2);
        // $this -> workshop1 = new Assemble();
        // $this -> workshop2 = new Workshop();
    }

    public function manufacture(){
        echo 'Car ';
        return $this ->workshop1 ->work();
        return $this ->workshop2 ->work();
    }
}

// error_ 此处用extends继承
class Motorcycle extends Vehicle{
    //error_ 此处无需再次声明成员变量
    // protected $workshop1;
    // protected $workshop2;

    //error_ 此处沿用父类写法 对象类型+对象名
    function __construct ( Workshop $workShop1, Workshop $workShop2){
        //error_ 此处使用父类方法
        parent::__construct ( $workShop1, $workShop2);
        // $this -> workshop1 = new Assemble();
        // $this -> workshop2 = new Workshop();
    }

    public function manufacture(){
        echo 'Motorcycle ';
        return $this ->workshop1 ->work();
        return $this ->workshop2 ->work();
    }
}

class BridgeTest {
    public function testCar(){
        $vehicle = new Car(new Produce(), new Assemble());
        $vehicle->manufacture();
    }
    public function testMotorcycle(){
        $vehicle = new Motorcycle(new Produce(), new Assemble());
        $vehicle->manufacture();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值