◎筱米加步枪◎.Blog

Happy coding

装饰者模式

筱米加步枪 posted @ 2010年3月09日 01:27 in [ 设计模式 ] with tags 设计模式 装饰者模式 , 2338 阅读

今天,看了《head first》中的装饰者模式,总结如下:

装饰者模式应用场合:当需要为一个特定实物加上各式各样职责的时候,可能未来还有更多的职责要附加在该实物身上,为了符合设计模式中的一个原则---开放关闭原则,在不去修改类、只要增加一些类的情况下,便可达到这种目的。

比如:1.为一个人进行装饰,衣服、裤子、鞋子、帽子等、一个人每天都有不同的装饰,这是无法去预测的。

            2.为饮料中加入不同的调料,每个人的口味不同,这也是无法预测的。

为了解决这类问题,使用在运行时进行组合方式能够很好的解决这类问题。---装饰者模式~~

装饰者模式的基本结构图:

以一个场景模拟装饰者模式:一个人早上起来要想今天出门应该怎么打扮才好。~~~

组件接口:

/**
 * 组件接口,接口中有些方法
 * 
 * @author ChenST
 *
 * @create 2010-3-9
 */
public interface Component {
	
	/**  打扮 */
	public void dress();
}

组件接口的实现类:一个人

/**
 * 人的一个类,人需要打扮
 * 
 * @author Administrator
 *
 * @create 2010-3-9
 */
public class Human implements Component {

	/*
	 * 开始打扮
	 * (non-Javadoc)
	 * @see com.shine.model.component.Component#dress()
	 */
	public void dress() {
		System.out.print("我今天要穿:");
	}
}

装饰者抽象类:实现了Component接口,目的是为了和被装饰者类型保持一致性

/**
 * 装饰者接口,通用装饰器
 * 
 * @author ChenST
 *
 * @create 2010-3-9
 */
public abstract class Decorator implements Component {

	/*
	 * 打扮
	 * (non-Javadoc)
	 * @see com.shine.model.component.Component#dress()
	 */
	public abstract void dress();
}

具体装饰者1:--衣服。

/**
 * 装饰物-衣服
 * @author Administrator
 *
 * @create 2010-3-9
 */
public class Clothes extends Decorator {

	/** 被装饰物(装饰目标)*/
	private Component component;
	
	public Clothes(Component component){
		this.component = component;
	}
	
	@Override
	public void dress() {
		this.component.dress();
		//在原始打扮上加上该装饰-衣服
		System.out.print("衣服");
	}
}

具体装饰者2:--裤子

/**
 * 装饰对象--裤子
 * 
 * @author ChenST
 *
 * @create 2010-3-9
 */
public class Trousers extends Decorator {

	/** 被装饰物(装饰目标)*/
	private Component component;
	
	public Trousers(Component component){
		this.component = component;
	}
	
	@Override
	public void dress() {
		this.component.dress();
		//在原始打扮上加上该装饰-裤子
		System.out.print(" 裤子 ");
	}
}

具体装饰者3:--鞋子

/**
 * 装饰对象--鞋子
 * 
 * @author ChenST
 *
 * @create 2010-3-9
 */
public class Shoes extends Decorator {

	/** 被装饰物(装饰目标)*/
	private Component component;
	
	public Shoes(Component component){
		this.component = component;
	}
	
	@Override
	public void dress() {
		this.component.dress();
		//在原始打扮上加上该装饰-鞋子
		System.out.print(" 鞋子 ");
	}
}

测试类:这个人开始打扮啦~~~~~

/**
 * 测试装饰者模式(模拟场景:一个人出门要装扮)
 * 
 * @author ChenST
 *
 * @create 2010-3-9
 */
public class Test {

	public static void main(String[] args) {
		//描述一个人
		Component human=new Human();
		//这个人要穿衣服,用衣服去装饰,得到穿衣服后的人
		human=new Clothes(human);
		human.dress();
		System.out.println();
		//这个人要穿裤子,用裤子去装饰,得到穿衣服和裤子后的人
		human=new Trousers(human);
		human.dress();
		System.out.println();
		//这个人要穿鞋子,用鞋子去装饰,得到穿衣服、裤子和鞋子后的人
		human=new Shoes(human);
		human.dress();
	}
}

运行结果:

我今天要穿:衣服
我今天要穿:衣服 裤子 
我今天要穿:衣服 裤子  鞋子

可以看到,是在运行时才决定这个人今天要穿什么,加入有更多的装饰,比如帽子、耳环、项链等更多的视屏,只需要增加这些装饰类,然后在运行时给他装扮上去就可以完成,或者也可以为其他东西装扮,比如为房间装扮,那么只需要增加实现了组件接口的房间类,然后再装扮,很符合开发-封闭原则,也符合多用组合、少用继承的原则。

NBSE 6th Class Text 说:
2023年9月28日 22:16

Nagaland Board 6th Class Book 2024 for Science, Social Science, English, Hindi, Mathematics, EVS, Various Provide in School Wise Free Distribution in Government School, NBSE High School Various Class Complete Students Do not Waste Summers Holidays, Download Nagaland Board Class Book 2024 Regular Practice new Lessions for Students Best idea Students Method.Nagaland Board Class Textbook 2024 Download NBSE 6th Class Textbook 2024 Available Official Website, Our Portal Provide Nagaland Board High School Books 2024 Download, Hindi Medium, English Medium and Urdu Medium Textbooks.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter