装饰者模式总结

装饰者模式包含两种对象:装饰者和组件【被装饰者】

装饰者模式的核心思想:

1.替代继承,动态的将责任附加到对象上

2.有效的扩展行为同时不违反开闭原则

3.有效的复用修饰者

装饰者模式的设计原则:开闭原则,多用组合少用继承,低耦合

装饰者模式的用途:

1.需要生产大量的类

2.这些类又可以原子化成数量不多的小类

3.这些小类的组合可以构成(1)的类

装饰者模式的缺点:

1.组件不宜被过多的类装饰,代码会冗长(使用工厂模式可以有效解决)

2.如果一个装饰类同时装饰多种组件,维护仍是麻烦的(如咖啡加糖要收钱,但是甜品加糖就不需要收钱)

3.同一个组件被装饰者装饰多次【加10个鸡蛋】,只能重复调用装饰方法,特别是,这个装饰方法还是个构造函数的时候,你还需要不停的new

4.不可以用非同一类别的【不是继承自同一个父类/接口】修饰者修饰同一个组件。(如水、佐料都是食物,板蓝根是药品,来一份重口味的板蓝根泡面就很难实现)

5.可以修饰组件,但是取消就非常麻烦,毕竟传递进去的对象是被处理过的,没有进行保存

简单示例

文本编辑中,句子和字的修饰关系【好像有点牵强,修饰者模式也算是组合吧】

package decratorpattern;

public interface Decrator {

	/**
	 * 展示信息
	 * @return
	 */
	String display();

}
package decratorpattern;

public class Sentence implements Decrator{

	Word words = new Word("");

	@Override
	public String display() {

		return words.display();
	}

	/**
	 * 装饰
	 *
	 * @param d
	 */
	public void decrate(Word d) {
		if(d != null)
		{
			words.connect(d);
		}
	}

}
package decratorpattern;

public class Word implements Decrator{

	private String word = null;

	public Word(String word)
	{
		this.word = word;
	}

	/**
	 * 展示内容
	 */
	@Override
	public String display() {

		String displayString = "";

		if(word!=null)
		{
			displayString += word;
		}

		return displayString;
	}

	/**
	 * 装饰
	 */
	public void connect(Decrator d) {
		if(d != null)
		{
			word += d.display();
		}
	}

}
package decratorpattern;

public class Test {

	public static void main(String[] args) {

		Word w1 = new Word("今天");
		Word w2 = new Word("天气");
		Word w3 = new Word("很好");
		Word w4 = new Word("!");

		Sentence s = new Sentence();

		s.decrate(w1);
		s.decrate(w2);
		s.decrate(w3);
		s.decrate(w4);

		System.out.println(s.display());
	}
}

测试结果

今天天气很好!
时间: 2024-10-16 16:35:53

装饰者模式总结的相关文章

装饰者模式

* 通过使用修饰模式,可以在运行时扩充一个类的功能. * 原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数. * 装饰类实现新的功能,而在不需要用到新功能的地方,它可以直接调用原来的类中的方法. * 修饰类必须和原来的类有相同的接口. * 修饰模式是类继承的另外一种选择.类继承在编译时候增加行为,而装饰模式是在运行时增加行为. * 当某个类具有多种可组合叠加的行为或属性时,装饰者模式可以通过动态增加装饰类,以避免排列组合,减少需要类的数量. 共同的

javascript设计模式学习之——装饰者模式

一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用户来说是透明的. 和java等语言不同的是,java的装饰器模式是给对象动态添加职责,javascript中,给对象添加职责的能力是与生俱来的,更侧重于给函数动态添加职责. 二.java中的装饰者模式实现 package com.bobo.shejimoshi.derector; public cl

每天一段笔记-装饰者模式(Decorator pattern)

知识点 类应该对扩展开放,对修改封闭. 案例 (本故事纯属虚构) 某日早上,流年刚把新开发的游戏项目提交给经理 1 public abstract class Role 2 { 3 public virtual string RoleName { get; private set; } 4 public abstract int PhysicalAttack(); 5 } 1 class Samurai : Role 2 { 3 public override string RoleName 4

Java设计模式菜鸟系列(三)装饰者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199 装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案.对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装.像咱们以前经常使用的Java里面的IO流就用到了装饰者模式.比如:BufferedReader br = new BufferedReader(new InputStreamReader(new Fi

JS设计模式之装饰者模式

装饰者模式概述 在不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法)使原有对象可以满足用户更复杂的需求 实际需求 在已有的代码基础上,为每个表单中的input默认输入框上边显示一行提示文案,当用户点击输入框时文案消失 原有代码: var telInput = document.getElementById('tel_input'); var telWarnText = document.getElementById('tel_warn_text'); input.onclick =

Java设计模式の装饰者模式

目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些布尔值变量代表是否加入各种调料,基类的cost()中的计算各种调料的价钱,子类覆盖cost(),并且在其中调用超类的cost(),加上特定饮料的价钱,计算出子类特定饮料的价钱. 缺点:类数量爆炸.基类加

【设计模式】之装饰器模式

为什么会有装饰模式? 装饰模式是为了解决继承强依赖性和出现大量子类不方便管理问题而出现的.   1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态

Decorator Pattern(装饰器模式)Demo1

一个简单的装饰器模式例子,用来体现直接查询,缓存查询,和过滤敏感词汇 1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.List; 8 im

装饰器模式

定义:可以动态地添加修改类的功能 解析:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性. $canvas1 = new IMooc\Canvas();$canvas1->init();$canvas1->addDecorator(new \IMooc\ColorDrawDecorator('green'));$canvas1->addDecorato

06JavaIO详解_IO流中的设计模式-装饰者模式

Io流里面的过滤流和节点流用的就是装饰者模式.整个的IO体系就是装饰模式. 这个写法就是装饰者模式.对上面的三个已经存在的类(DataOutputStream,BufferedOutputStream,FileOutputStream)进行组合,具有三种功能. 对于DataOutputStream dos=new DataOutStream(new BufferedOutputStream(new FileOutputStream("data.txt"))); 这行代码来说. OutP