码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(四)装饰器模式

时间:2015-05-18 16:18:19      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

  首先,让我们看看枪:

  某一把枪,可以给它加上不同的组件,使它具有不同的功能。比如说ak47原来是这样:

技术分享

  给他加了刺刀之后,它有了拼刺刀的作用:

技术分享

  如果给它加上望远镜,于是有了瞄准狙击的功能:

技术分享

  如果还要添加功能,这里我们就可以用装配器模式对这个枪进行修饰。一个普通枪以及其他种类的枪都属于武器,也就是说他们都要继承一个武器类,无论是普通枪还是添加了功能的枪他们都是枪,此外,一个枪不仅可以安装望远镜,还可以同时安装刺刀。于是乎装配器模式的关系可以用下图来形容,建模工具搞了半天没搞到。

技术分享

  Gun和FunctionGun都实现了了Weapon接口,其中,FunctionGun是Gun的装饰类,一般是一个抽象类。SniperGun和KnifeGun是具体的装饰功能类。

  首先是一个武器接口:

public interface Weapon {
	public void function();
}

   之后是一个实现此接口的枪类:

public class Gun implements Weapon{
	@Override
	public void function() {
		System.out.println("I can shoot!");
	}
}

   可以给枪类Gun增加功能的,实现了Weapon接口的装饰器抽象类:

public abstract class FunctionGun implements Weapon{
	public void addFunction(){
		System.out.println("add a function!");
	}
}

   装饰器抽象类的两个具体的实现类:KnifeGun

public class KnifeGun extends FunctionGun{
	private Weapon wp;
	public KnifeGun(Weapon wp) {
		super();
		super.addFunction();
		this.wp=wp;
	}
	@Override
	public void function() {
		wp.function();
		stab();
	}
	public void stab(){//New function
		System.out.println("I can stab!");
	}
}

   SniperGun

public class SniperGun extends FunctionGun{
	private Weapon wp;
	public SniperGun(Weapon wp) {
		super();
		super.addFunction();
		this.wp=wp;
	}
	@Override
	public void function() {
		wp.function();
		aim();
	}
	public void aim(){
		System.out.println("I can aim!");
	}
}

   最后是测试类:

public class Test {
	public static void main(String[] args) {
		Weapon weapon = new Gun();
		weapon = new SniperGun(new KnifeGun(weapon));//先加刺刀,然后加瞄准镜
		weapon.function();
		System.out.println("--------");
		Weapon weapon2 =new Gun();
		weapon2 = new SniperGun(weapon2);//只装瞄准镜
		weapon2.function();
	}
}

   TestResults:

add a function!
add a function!
I can shoot!
I can stab!
I can aim!
--------
add a function!
I can shoot!
I can aim!

   接下来我们可以看看Java的IO包中一部分类的结构:

技术分享

  例如:

InputStream ins = new FileInputStream("C:\\Users\\Desktop\\classtest.txt");
ins= new BufferedInputStream(ins);
System.out.println(ins.read());
ins.close();

  综上,我们分析,装饰器模式的好处有以下几点:1,原始实现的接口不必在后期增加功能的时候修改。2,可以动态的增加功能。3,如果想增加FileInputStream的功能,并不需要继承FileInputStream的子类实现,而是由装配器FilterInputStream实现,保持相对功能的独立性。

 

设计模式(四)装饰器模式

标签:

原文地址:http://www.cnblogs.com/zhangxd-stn/p/zhangxd_3.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!