1.1 简述及实现原则
装饰模式:在不改变 原有类 和 不使用继承的情况下, 动态地扩展一个对象的功能。
因会创建一个包装对象,来包裹真实对象而得名。
作用:增强对象的功能
例子1:
墙: 功能---遮风挡雨
包了墙纸的墙(本质还是墙):
原功能---遮风挡雨
新增功能---陶冶情操
1、没有改变原有类
2、进行动态地增强
装饰类:增强功能的类(包了墙纸的墙)
被装饰类:待增强功能的类(墙)
实现原则:
1、 装饰类必须实现被装饰类的所有接口
2、装饰类中必须获取被装饰类对象
1.2 案例演示
准备代码
Phone接口:
public interface Phone {
void call(String number);
void sendMsg();
}
HWPhone实现类:
public class HWPhone implements Phone {
public void call(String number) {
System.out.println("拨打电话:"+number);
}
public void sendMsg() {
System.out.println("发送短信");
}
}
分析:
1、定义一个装饰类 实现 Phone接口
2、装饰类中 获取到 被装饰类对象(成员变量)
代码实现:
HWPhoneDecorator:
public class HWPhoneDecorator implements Phone {
//被装饰类的对象
private HWPhone old;
public HWPhoneDecorator(HWPhone old) {
this.old = old;
}
/*
* 打电话方法不需要增强,不需要改变
* */
public void call(String number) {
old.call(number);
}
/**
* 发短信方法需要被增强
*/
public void sendMsg() {
//1、先运行原来的功能
old.sendMsg();
//2、再执行新的增强代码
System.out.println("(o゜▽゜)o☆[BINGO!]");
}
}
测试类:
public static void main(String[] args) {
Phone hw = new HWPhoneDecorator(new HWPhone());
hw.call("12345");
hw.sendMsg();
}
未使用装饰者设计模式效果
拨打电话:12345
发送短信
使用装饰者设计模式效果
拨打电话:12345
发送短信
(o゜▽゜)o☆[BINGO!]