装饰模式:是一种为已有功能动态添加新的功能的设计模式,比生成子类更具有灵活性。
情景:世界上有很多房间,每个房间都或多或少会有一些家具,但是每个房间的家居几乎都是不一样的(忽略品牌,只是单纯的桌子,椅子,电视等),设计一个程序使得对于每一个房间我们都能动态增加家居,剔除家居。你会怎样设计?注:为了更清楚的显示将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.提高了可扩展性,能在原有的基础上动态添加新的功能(家具)