• 装饰者模式 (decorator pattern)


    参考 : Head First 设计模式(中文版)

    这篇只作为个人温习!

    用意 : 动态地给一个对象添加|扩展一些行为。Decorator 强调用对象组合而非继承来实现扩展,这显得较为灵活。

    角色:

    1.装饰者 

    2.被装饰者 

    特点与原理 : 

    0."被装饰者"被装饰之后,会被"装饰者"给包起来,外界看来它是被替代掉了,或者说原本的"被装饰者"被隔离了。

    1."装饰者 "和"被装饰者 "必须是同一个抽象类派生出来的。(因为"装饰者"必须能替代掉"被装饰者")

    2."装饰者"也可以被装饰(可以一直被再装饰),但是"被装饰者"不能装饰别人.

    3."被装饰者"可以说是一个起点,一但它被"装饰者"装饰后,装饰者将替代掉它.

    4.比如 a 对象被 b对象装饰后 , 外界就不能在访问a对象,b对象会保留a对象指针,那么外界通过调用 b 对象的方法来实现功能 , 这样我们便可以定义扩展方法在b对象上,b既可以调用原始a对象的方法,也可以添加扩展方法。

    简单例子 : 

    public abstract class Product //基类 
    {       
        public abstract double getPrice(); //既然是要扩展,自然是用抽象方法咯 
    }
    public class Nasi : Product //"被装饰者"一定要派生自基类
    {
        public override double getPrice()
        {
            return 100.00;
        }
    }
    public abstract class Decorator : Product //"装饰者"一定要派生自基类
    {
        public Product product { get; set; } //每个装饰者都必须保留被装饰对象的指针
    }
    public class Sayur : Decorator 
    {       
        public Sayur(Product product) //这里的product既可以是"装饰者"也可以是"被装饰者"
        {
            this.product = product; //保存指针
        }
        public override double getPrice()
        {
            return this.product.getPrice() + 10; //调用原来方法,再添加扩展逻辑
        } 
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        Product nasi = new Nasi();
        Product nasiWithSayur = new Sayur(nasi); //用Sayur这个"装饰者"来装饰product,装饰后product就被替换掉了.
        Product nasiWithDoubleSayur = new Sayur(nasiWithSayur); //第2次装修返回的又是另一个对象了
        double price = nasiWithDoubleSayur.getPrice();//由于我们是面向抽象编程,所以不管怎么装饰都好,这个对象依旧是一个Product,所以就一定有getPrice方法,只是它的内部已经是不同的实现了。
    }

    记忆联想 :

    规范 : 装饰对象,和被装饰的对象都派生自一个类

    实现 : 对象包对象,外层对象的方法是调用内层对象并且加上自己的逻辑扩展。

  • 相关阅读:
    [导入]郎咸平在复旦大学的精彩演讲
    [导入]郎咸平介绍
    [导入]郎咸平网络文摘 在线交流论坛
    Delphi7,创建 RGB CMYK颜色分量圆 完整代码
    Excel分类汇总/平均/计数的办法
    Word插入 分节符实现多个页码
    Delphi 7中如何修改Form1: TForm1;
    在delphi 7里怎么给已有的单元文件改名
    Mac下安装mysql后无法启动,提示. ERROR! The server quit without updating PID file(就是账户权限不够)
    pip虚拟环境下倒出安装文件,或者批量导入安装。
  • 原文地址:https://www.cnblogs.com/keatkeat/p/4000420.html
Copyright © 2020-2023  润新知