zoukankan      html  css  js  c++  java
  • 设计模式之装饰模式(Decorator)

    对于装饰模式的个人理解:

    就是在物体上进行某种状态的增强,直白的说:比如一个火箭,默认只有一个推进器,现在想让火箭飞行的更远一点,我们需要在原来的火箭基础上面再添加一个火箭推进器,这样我们原来的火箭就可以依靠2节推进器,飞行的更远了。假如以后我们需求改变,需要有一种飞行更远更远的火箭,我们不需要修改原来的火箭,只要继续追加推进器的数量就行了。这样的解决方案就是装饰模式的精髓。依照上面的案例解释,想想思路,一个燃料接口(FuelInterface),具体的2种燃料(Gas,Hydrogen),Gas下还包括一种增强型燃料(SuperGas),一个测试火箭(Rocket),开始写代码:

    public interface FuelInterface {
    	public int addFlyDistance();
    }
    


    public class Hydrogen implements FuelInterface{
    	public FuelInterface fuel;
    
    	public Hydrogen() {
    	}
    
    	public Hydrogen(FuelInterface f) {
    		fuel = f;
    	}
    
    	@Override
    	public int addFlyDistance() {
    		if (fuel != null)
    			return fuel.addFlyDistance() + 5000;
    		else
    			return 5000;
    	}
    }
    
    public class Gas implements FuelInterface {
    	public FuelInterface fuel;
    
    	public Gas() {
    	}
    
    	public Gas(FuelInterface f) {
    		fuel = f;
    	}
    
    	@Override
    	public int addFlyDistance() {
    		if (fuel != null)
    			return fuel.addFlyDistance() + 2500;
    		else
    			return 2500;
    	}
    
    }
    
    public class SuperGas extends Gas {
    	public FuelInterface fuel;
    
    	public SuperGas() {
    	}
    
    	public SuperGas(FuelInterface f) {
    		fuel = f;
    	}
    
    	@Override
    	public int addFlyDistance() {
    		return fuel.addFlyDistance() + 5000;
    	}
    
    }
    
    public class Rocket {
    	private FuelInterface fuel;
    
    	public Rocket(FuelInterface f) {
    		fuel = f;
    	}
    
    	public int Launch() {
    		return fuel.addFlyDistance();
    	}
    }
    



    测试代码:

    public class Main {
    	public static void main(String[] args) {
    		Gas g1 = new Gas();
    		Gas g2 = new Gas(g1);
    		SuperGas g3 = new SuperGas(g2);
    		Hydrogen h1 = new Hydrogen(g3);
    		Hydrogen h2 = new Hydrogen(h1);
    
    		Rocket r = new Rocket(h2);
    		System.out.println(r.Launch()+"km");
    	}
    }
    


    运行结果:

    20000km

    燃料总量:g1+g2+g3+h1+h2 = 2500 + 2500 + 5000 + 5000 + 5000。这个好处是显而易见的。

    下次我们可能需要增加燃料,或者减少燃料。直接在创建时操作就行了。这种跟Java 的IO管道流的多层包装一样。

    代码的实现上,我感觉有点递归的感觉,在addFlyDistance()函数中体现,当然,那不是真正意义上面的递归。这样我们的代码可以动态的增加状态,增加新功能。

    我们程序的好处是:动态为对象增加新的职责。也就是给火箭动态的增加它的飞行距离,这就是我们需要的效果。该程序的设计有点像小时候用的一种铅笔,那种一节一节组成的,头尾相连,可以连接的非常长,每一节都有一个铅笔头。

    项目源代码位置:http://www.kuaipan.cn/file/id_132802506211221457.htm?source=1

  • 相关阅读:
    【iCore4 双核心板_uC/OS-II】例程十一:内存管理
    【iCore4 双核心板_uC/OS-II】例程十:信号量集
    【iCore4 双核心板_uC/OS-II】例程九:消息队列
    【iCore4 双核心板_FPGA】实验十九:使用JTAG UART终端打印信息
    【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
    【iCore4 双核心板_uC/OS-II】例程七:互斥信号量
    【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步
    【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源
    【iCore4 双核心板_uC/OS-II】例程四:软件定时器
    【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复
  • 原文地址:https://www.cnblogs.com/vokie/p/3602072.html
Copyright © 2011-2022 走看看