zoukankan      html  css  js  c++  java
  • 设计模式-装饰模式

    装饰模式 Decorator Pattern: (结构型模式)
    动态的给一个对象增加一些额外的职责。
    在不改变原类和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,
    也就是装饰包裹真实的对象。所以人们有啥也称它为包装器 Wrapper, 与适配器模式别名相同,
    它们使用的场合不同。

    我们常用的给一个类增加行为方法:
    1、继承机制,使用继承机制给类增加功能
    2、关联机制:即是将一个类的对象嵌入到另外一个对象中,然后用这个对象调用它自己的一些行文。

    那为啥子还有装饰器模式呢?
    因为装饰器模式比继承生成子类更加灵活,可以动态的增加功能,也可以动态撤销功能。


    装饰模式包含如下角色:
    Component: 抽象组件:定义一个对象接口,以规范准备接受附加责任的对象,即可给这些对象动态添加职责
    ConcreteComponent 具体组件角色:被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
    Decorator 抽象装饰类: 维持一个指向组件对象的实例,并定义一个与抽象组件角色接口一致的几口
    ConcreteDecorator 具体装饰类: 向组件添加角色。

    示例:

    <?php
    //https://blog.csdn.net/jhq0113/article/details/45458133
    //对象接口
    interface IComponent
    {
        function Display();
    }
    
    
    //待装饰对象
    class Person implements IComponent
    {
        private $name;
    
        function __construct($name) {
            $this->name = $name;
        }
    
        function Display() {
            echo "装扮: ".$this->name." 
    ";
        }
    }
    
    //装饰器父类
    class Clothes implements IComponent
    {
        protected $component;
    
        function Decorate(IComponent $component) {
            $this->component = $component;
        }
    
        function Display() {
            if (!empty($this->component)) {
                $this->component->Display();
            }
        }
    }
    
    //具体装饰器
    class PiXie extends Clothes
    {
        function Display() {
            echo "皮鞋 ";
            parent::Display();
        }
    }
    
    class QiuXie extends Clothes
    {
        function Display() {
            echo "球鞋 ";
            parent::Display();
        }
    }
    
    class Tshirt extends Clothes
    {
        function Display() {
            echo "Txue ";
            parent::Display();
        }
    }
    
    class WaiTao extends Clothes
    {
        function Display() {
            echo "外套 ";
            parent::Display();
        }
    }
    
    $YaoMing = new Person("姚明");
    $pixie = new PiXie();
    $WaiTao = new WaiTao();
    
    $pixie->Decorate($YaoMing);
    $WaiTao->Decorate($pixie);
    $WaiTao->Display();
  • 相关阅读:
    LightOJ1031 Easy Game(区间DP)
    POJ1325 Machine Schedule(二分图最小点覆盖集)
    ZOJ1654 Place the Robots(二分图最大匹配)
    LightOJ1025 The Specials Menu(区间DP)
    POJ2288 Islands and Bridges(TSP:状压DP)
    LightOJ1021 Painful Bases(状压DP)
    LightOJ1013 Love Calculator(DP)
    POJ1780 Code(欧拉路径)
    POJ1201 Intervals(差分约束系统)
    ZOJ2770 Burn the Linked Camp(差分约束系统)
  • 原文地址:https://www.cnblogs.com/jiujuan/p/10296277.html
Copyright © 2011-2022 走看看