装饰模式:在不改变 原有类 和 不使用继承的状况下, 动态地扩展一个对象的功能。java
因会建立一个包装对象,来包裹真实对象而得名。设计模式
做用:加强对象的功能测试
例子1:this
墙: 功能---遮风挡雨spa
包了墙纸的墙(本质仍是墙):设计
原功能---遮风挡雨code
新增功能---陶冶情操对象
一、没有改变原有类继承
二、进行动态地加强接口
装饰类:加强功能的类(包了墙纸的墙)
被装饰类:待加强功能的类(墙)
实现原则:
一、 装饰类必须实现被装饰类的全部接口
二、装饰类中必须获取被装饰类对象
准备代码
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("发送短信"); } }
分析:
一、定义一个装饰类 实现 Phone接口
二、装饰类中 获取到 被装饰类对象(成员变量)
代码实现:
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() { //一、先运行原来的功能 old.sendMsg(); //二、再执行新的加强代码 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!]