• 设计模式-装饰模式


       1、背景
       给对象增加新功能,如何实现:
       (1)、在原类里面增加——违背开放封闭原则,类可以扩展但不能被修改。
       (2)、利用继承扩展功能——造成类不断增多。
        例子:给汽车增加对讲机系统,GPS定位系统,影视播放等,这些都不是汽车类的属性。如何增加?

    ///需要添加新功能的对像
    public
    class Car { private string name; public string Name { get { return name; } set { name = value; } } public Car() { } public Car(string cName) { this.name = cName; } //其余属性略 public virtual void CarDescription() { Console.WriteLine(" 装饰的汽车“{0}”。", name); } }    //被装饰对象的子类,包含添加装饰对象,和执行装饰对象方法的两个函数 public abstract class DecoratorCar:Car { protected Car car; public void Decorator(Car dcar) { car = dcar; } public override void CarDescription() { if (car != null) car.CarDescription(); } }    //GPSCar 被装饰对象的子子类,需要添加的装饰对象(带有gps功能的汽车) public class GPSCar : DecoratorCar { string gStr = "先进的GPS系统 "; public override void CarDescription() { Console.Write(gStr); base.CarDescription(); } } //TransmitterCar public class TransmitterCar : DecoratorCar { string tStr = "卫星对讲机系统 "; public override void CarDescription() { Console.Write(tStr); base.CarDescription(); } } //Movies public class MoviesCar : DecoratorCar { string mStr = "先进的影视系统 "; public override void CarDescription() { Console.Write(mStr); base.CarDescription(); } }   

    调用:

     static void Main(string[] args)
            {
                Car car = new Car("奔驰520");
    
                GPSCar gCar = new GPSCar();
                TransmitterCar tCar = new TransmitterCar();
                MoviesCar mCar = new MoviesCar();
    
                gCar.Decorator(car);
                tCar.Decorator(gCar);
                mCar.Decorator(tCar);
    
                mCar.CarDescription();
    
                Console.ReadLine();
            }
    
      

     最终显示结果:

     

      我觉得装饰模式逻辑比较清晰一些,如果用继承来实现,继承Car,扩展一个方法装饰GPS,这就成了一个有GPS的车。如果过几天GPS要拆掉处理起来就有些说不通了。而对于汽车来说,只要不是它的固有属性(轮子,发动机,方向盘等)的都可视为是装饰品。装饰模式将这些用于装饰的东西,封装成一个一个的类,可以随时拿来使用也可以去掉,比较方便一些。

  • 相关阅读:
    CentOS 7.4 发布下载,安全稳定的Linux发行版
    PHP缓存机制详解
    用FastDFS一步步搭建文件管理系统
    linux中mv命令使用详解
    linux grep命令详解
    音频放大器的设计
    C#学习笔记(九)——集合、比较和转换
    Kinect学习笔记(五)——更专业的深度图
    C#学习笔记(八)——定义类的成员
    kinect学习笔记(四)——各种数据流
  • 原文地址:https://www.cnblogs.com/yundan/p/4109978.html
Copyright © 2020-2023  润新知