装饰模式

装饰模式:是一种为已有功能动态添加新的功能的设计模式,比生成子类更具有灵活性。

情景:世界上有很多房间,每个房间都或多或少会有一些家具,但是每个房间的家居几乎都是不一样的(忽略品牌,只是单纯的桌子,椅子,电视等),设计一个程序使得对于每一个房间我们都能动态增加家居,剔除家居。你会怎样设计?注:为了更清楚的显示将Furniture类名改为Decoration,因此,下图的Furniture的类图即Decoration的类图。

如下,代码结构图


如上图,有以下代码

 class  Room{
	private String name;
	public Room(){}
	public Room(String name){
		this.name=name;
	}
	public  void Show(){
		System.out.println("的"+name);
	}
}
 
class Decoration extends Room{
	protected Room newroom;
	public void DecorationRoom(Room setroom){
		this.room = setroom;
	}
	public void Show() {
		if(room != null){
			room.Show();//此处的room代表的是某个具体的家居
		}
	}
	
}

class Sofa extends Decoration
{
	public void Show(){
		System.out.print("有沙发");
		super.Show();
	}
}
class TV extends Decoration{
	public void Show(){
		System.out.print("有电视");
		super.Show();
	}
}
class Table extends Decoration{
	public void Show(){
		System.out.print("有桌子");
		super.Show();
	}
}
class Refrigerator extends Decoration{
	public void Show(){
		System.out.print("有冰箱");
		super.Show();
	}
}
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Room room = new Room("彩虹屋");
		Decoration furniture = new Decoration();
		furniture.DecorationRoom(room);
		
		/*
		 * 实例化家居
		 */
		TV  Tv = new TV();
		Sofa sofa = new Sofa();
		Table table = new Table();
		Refrigerator re = new Refrigerator();
		/*
		 * 开始装饰
		 */
		System.out.print("方案一:");
		Tv.DecorationRoom(room);
		sofa.DecorationRoom(Tv);
		sofa.Show();
		
		System.out.print("方案二:");
		re.DecorationRoom(room);
		table.DecorationRoom(re);
		Tv.DecorationRoom(table);
		Tv.Show();
		
	}

}

运行结果如下

方案一:有沙发有电视的彩虹屋
方案二:有电视有桌子有冰箱的彩虹屋

由代码可得出装饰模式的优点在于:

1.把Dectoration类中的家具装饰功能从类中移除,这样简化了原有的类

2.提高了可扩展性,能在原有的基础上动态添加新的功能(家具)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值