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

  首先,让我们看看枪:

  某一把枪,可以给它加上不同的组件,使它具有不同的功能。比如说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实现,保持相对功能的独立性。

时间: 2024-10-07 22:03:59

设计模式(四)装饰器模式的相关文章

java设计模式之 装饰器模式

适AT java设计模式之 装饰器模式 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.模拟一个人从想吃饭.找饭店.享受美食.结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package deco

python设计模式之装饰器模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. import time def log_calls(func): def wrapper(*args,**kwargs): now=time.time() print("Calling{0} with {1} and {2}

设计模式之: 装饰器模式

什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这种设计模式为数不多,而装饰器就是其中之一. 什么时候使用装饰器模式 基本说来, 如果想

php设计模式之装饰器模式

1.介绍 1.装饰器模式(Decorator),可以动态地添加修改类的功能 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 3.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性. 2.实例 接下来我们举一个例子,使用php实现一个小画板的功能(画指定颜色图形) 1.没使用装饰器之前的传统方式 1.实现一个画板的类 <?php class Canvas { //保存点阵的一个数组 public $data

设计模式之装饰器模式

一.百科 概述: 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4) 装饰对象可以在转发这些请

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的

23种设计模式之装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发

浅谈设计模式(二):装饰器模式|中介模式|原型模式

装饰器模式(Decorator Pattern) 装饰器模式可用来给一个类动态添加功能,将其装饰成一个新的类.这就是装饰器的概念.看到这里我们可能会想,要达到这种效果,我们用子类继承父类不就可以了吗? 没错装饰器模式,本身是一种继承的替代方案.那既然是替代方案,那么自然就有它不一样的地方. 具体区别在哪里呢? 请看 装饰器模式更灵活:继承时父子类的关系是静态的,而装饰器模式是动态的,装饰类和被装饰类的关系是运行时候确认的 装饰类和被装饰类的耦合关系是松散的,各自可以独立变化 下面看看具体的代码.

设计模式之装饰器模式io的小入门(十一)

装饰器模式详解地址 原文总结 定义: 在不必改变原类文件和使用继承的情况下, 动态的扩展一个对象的功能. 通过创建一个包装对象, 也就是装饰来包裹真实的对象 部分详解提示 看了一些文档, 装饰器模式非常依赖构造器 与 重写方法 装饰器模式的特点: 不改变原来的类 , 不使用继承 , 动态扩展 流这块除了文件上传下载使用过, 确实用的太少了这里继续复习下最简单的文件上传 文件目录的创建 目录的是否存在没有就创建 不推荐: 年/月/日 一般没什么用户权限的图片之类的不过 推荐: 模块/用户/模块/年

java设计模式之装饰器模式

装饰器模式的应用场景:1.需要扩展一个类的功能.2.动态的为一个对象增加功能,而且还能动态撤销.(继承不能做到这一点,继承的功能是静态的,不能动态增删.) 源接口: 1 public interface Sourceable { 2 3 void method(); 4 } Source类: 1 public class Source implements Sourceable { 2 @Override 3 public void method() { 4 System.out.println