设计模式-装饰模式
这次主要记录下装饰模式的学习过程
一、什么是装饰模式
- 装饰模式(Strategy Pattern):动态地给一个对象添加一些额外的职责
- 优点:
- 将类中的装饰功能从类中移除,从而简化原有的类
- 有效地把类的核心职责和装饰功能区分开来,去除相关类中重复的装饰逻辑
- 与继承相比,具有更多的灵活性,可以动态地扩展一个类的功能
- 缺点:
- 多层装饰,会导致程序变得复杂
- 特点:
- 装饰对象和被装饰对象具有相同的接口
- 装饰对象中包含一个被装饰对象的引用
- 装饰对象接受所有来自客户端的请求,将其转发给被装饰对象
- 装饰对象可以在转发请求的前后增加一些附加功能
二、装饰模式UML图
三、装饰模式示例
Building.java
需要被装饰的基类,定义了一个对象接口,可以给这些对象动态地添加职责
/**
* @Title: Building.java
* @Description: 需要被装饰的基类
* @Author: xj
* @Date: 2018/9/3 22:37
*/
public abstract class Building {
public abstract void show();
}
House.java
需要被装饰的具体类,定义了一个具体的对象,可以给这个对象动态地添加职责
/**
* @Title: House.java
* @Description: 需要被装饰的具体类
* @Author: xj
* @Date: 2018/9/3 22:22
*/
public class House extends Building {
@Override
public void show() {
System.out.println("房子现在空空如也");
}
}
Decorator.java
装饰基类,从外类来扩展Building类的功能,但对于Building类来说,无需知道Decorator类的存在
/**
* @Title: Decorator.java
* @Description: 装饰基类
* @Author: xj
* @Date: 2018/9/3 22:35
*/
public abstract class Decorator extends Building {
private Building building;
public void setBuilding(Building building) {
this.building = building;
}
@Override
public void show() {
if (null != building) {
building.show();
}
}
}
Bed.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能
/**
* @Title: Bed.java
* @Description: 装饰具体类
* @Author: xj
* @Date: 2018/9/3 22:48
*/
public class Bed extends Decorator {
/**
* 本类独有的功能
*/
private String bed;
@Override
public void show() {
// 先执行父类方法,再执行本类方法
super.show();
bed = "往房子里添加床";
System.out.println(bed);
}
}
Chair.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能
/**
* @Title: Chair.java
* @Description: 装饰具体类
* @Author: xj
* @Date: 2018/9/3 22:52
*/
public class Chair extends Decorator {
/**
* 本类独有的功能
*/
private String chair;
@Override
public void show() {
// 先执行父类方法,再执行本类方法
super.show();
chair = "往房子里添加椅子";
System.out.println(chair);
}
}
Sofa.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能
/**
* @Title: Sofa.java
* @Description: 装饰具体类
* @Author: xj
* @Date: 2018/9/3 22:43
*/
public class Sofa extends Decorator {
/**
* 本类独有的功能
*/
private String sofa;
@Override
public void show() {
// 先执行父类方法,再执行本类方法
super.show();
sofa = "往房子里添加沙发";
System.out.println(sofa);
}
}
Table.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能
/**
* @Title: Table.java
* @Description: 装饰具体类
* @Author: xj
* @Date: 2018/9/3 22:50
*/
public class Table extends Decorator {
/**
* 本类独有的功能
*/
private String table;
@Override
public void show() {
// 先执行父类方法,再执行本类方法
super.show();
table = "往房子里添加桌子";
System.out.println(table);
}
}
Test.java
测试类
/**
* @Title: Test.java
* @Description: 测试类
* @Author: xj
* @Date: 2018/9/3 22:53
*/
public class Test {
public static void main(String[] args) {
Building house = new House();
System.out.println("第一种装修");
Decorator bed = new Bed();
Decorator sofa = new Sofa();
bed.setBuilding(house);
sofa.setBuilding(bed);
sofa.show();
System.out.println("装修结束...");
System.out.println("=================================");
System.out.println("第二种装修");
Decorator table = new Table();
Decorator chair = new Chair();
table.setBuilding(house);
chair.setBuilding(table);
chair.show();
System.out.println("装修结束...");
}
}
输出结果
以上就是装饰模式的一个小例子

浙公网安备 33010602011771号