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

    装饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类,而不是通过继承来完成,
    简单点说,三个继承关系 Father,Son,GrandSon 三个类,我要再 Son 类上增强一些功能怎么办?
    我想你会坚决的顶回去!不允许,对了,为什么呢?你增强的功能是修改 Son 类中的方法吗?增加方法吗 ?
    对 GrandSon 的影响哪?特别是 GrandSon 有多个的情况,你怎么办?这个评估的工作量就是够你受的,所以这个是不允许的,那还是要解决问题的呀,怎么办?
    通过建立 SonDecorator 类来修饰 Son,等于说是创建了一个新的类,这个对原有程序没有变更,通过扩充很好的完成了这次变更。

    以煮咖啡为例:

    public abstract class Cafe
    {
    	public abstract void Cook(); //煮咖啡
    }
    
    //摩卡咖啡
    public class MochaCafe extends Cafe
    {
    	public void Cook() {
    	//煮摩卡咖啡
    	}
    }
    
    //猫屎咖啡
    public class CivetCoffee extends Cafe
    {
    	public void Cook() {
    	//煮猫屎咖啡
    	}
    }
    
    //带牛奶的摩卡咖啡
    public class MilkMochaCafe extends MochaCafe
    {
    	public void AddMilk()
    	{
    		//加一些牛奶
    	}
    
    	public void Cook() {
    		//煮猫屎咖啡
    		super.Cook();
    		//煮完以后 再加牛奶
    		AddMilk();
    	}
    }
    
    //带糖的猫屎咖啡
    public class SugarCivetCoffee extends MochaCafe
    {
    	public void AddSugar()
    	{
    		//加一些糖
    	}
    	public void Cook() {
    		//煮猫屎咖啡
    		super.Cook();
    		//煮完以后 再加一些糖
    		AddSugar();
    	}
    }
    

    咖啡的种类越来越多,配料的除了糖和牛奶 还 增加了蜂蜜等,继承关系变得越来越多。
    继承关系越多系统架构越复杂,维护成本就会变高。
    装饰者,通过组合方式来扩展功能,而非继承的方式。
    我们来看下如何处理:

    //摩卡咖啡装饰者
    public class CafeDecorator extends MochaCafe
    {
    	private MochaCafe mochaCafe;
    
    	public CafeDecorator(MochaCafe mochaCafe) {
    		this.mochaCafe = mochaCafe;
    	}
    
    	public void AddSugar()
    	{
    		//加一些糖
    	}
    
    	public void AddMilk()
    	{
    		//加牛奶
    	}
    
    	public void Cook()
    	{
    		super.Cook();
    		AddSugar(); //煮咖啡之后加点糖
    		AddMilk(); //煮咖啡之后加牛奶
    	}
    }
  • 相关阅读:
    遥控器油门摇杆电位器封装尺寸图
    Microhard P900 900MHz跳频电台核心模块
    航路点
    当电桥为恒流源时惠斯通电桥电压的计算方法
    曲轴位置传感器
    16种发动机动态工作原理图,神奇的帅呆了!
    ffmpeg mediacodec 硬解初探
    ffmpeg编码常见问题排查方法
    阿里云 访问控制RAM
    WannaCry勒索病毒处理指南
  • 原文地址:https://www.cnblogs.com/zhuojun/p/5817695.html
Copyright © 2011-2022 走看看