zoukankan      html  css  js  c++  java
  • 设计模式漫谈之装饰模式

    我有点像疯子,一个人开了一天酒店,来写这个。我发现我写这个系列,阅读的人很少。也许是程序员不重视思想的东西,也许是感觉我写的很Low,无所谓,我只想告诉同行,程序员重在编程思想,有了编程思想技术的路才能走的更长更远。我很孤独,在自己的小世界里存活着。但是我也要耐着孤独,向更好的方向发展需要孤独,孤独也是一种享受生命的过程。

    给一个方法拓展功能,像面向结构中,一个方法里调用多个方法。在面向对象设计中可以是调用基类的方法,子类重写的时候增加功能。再次说下语言层面的东西,类,抽象类,接口的关系,是一种具体到概况的过程。类是具体的,抽象类是中间状态,接口是概况的。

    装饰模式就是给方法添加功能的。但是走的是面向对象的模式,也是方法堆栈调用的模式。一个对象中有其他对象的引用,那么这个对象是可以访问其他对象的。

    直接上例子我来解释:

    //一个基本对象,像个裸体的人。

    class Person
    {

    //默认构造函数
    public Person()
    { }

    private string name;

    //给数据赋值的构造函数
    public Person(string name)
    {
    this.name = name;
    }

    //方法的基本功能(可以重写)

    public virtual void Show()
    {
    Console.WriteLine("装扮的{0}", name);
    }
    }

    //装饰对象

    class Finery : Person
    {

    //被装饰对象的引用
    protected Person component;


    public void Decorate(Person component)
    {
    this.component = component;
    }

    //重写的方法

    public override void Show()
    {
    if (component != null)
    {
    component.Show();
    }
    }
    }

    //具体的装饰对象

    class TShirts : Finery
    {
    public override void Show()
    {
    Console.Write("大T恤 ");

    //调用其他装饰对象的方法

    base.Show();
    }
    }

    //具体的装饰对象

    class BigTrouser : Finery
    {
    public override void Show()
    {
    Console.Write("垮裤 ");
    base.Show();
    }
    }

    //具体的装饰对象

    class Sneakers : Finery
    {
    public override void Show()
    {
    Console.Write("破球鞋 ");
    base.Show();
    }
    }

    //被装饰的对象

    Person xc = new Person("小菜");

    Console.WriteLine(" 第一种装扮:");

    //装饰对象

    Sneakers pqx = new Sneakers();
    BigTrouser kk = new BigTrouser();
    TShirts dtx = new TShirts();

    //一层一层的装饰

    pqx.Decorate(xc);
    kk.Decorate(pqx);
    dtx.Decorate(kk);

    //一层一层的拆装饰
    dtx.Show();

    总结:装饰模式从代码上看就是一种对方法的扩展。从意思上看是用不同的对象来装饰。存了对象的引用就是存了对象的全部。还是那句话,编程是靠思想的,工作几年后,一定要形成自己的编程思想,自己的一套理论。如同人到40不惑一样,需要有自己的一套处事理论。

  • 相关阅读:
    token是什么?和session什么区别,怎么用
    HashTable详解
    Cookie和Session的区别
    测试基础面试题
    什么是回归测试?回归测试的主要目的是什么?
    每天一个linux常用命令--ls 和 -ll 有什么区别?
    python中6个序列的内置类型分别是什么,列表和元组的异同有哪些
    今天去面试自动化测试,被几个问题问住了,记录下
    python排序算法-冒泡和快速排序,解答阿里面试题
    Myeclipse使用积累
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8727981.html
Copyright © 2011-2022 走看看