1.Decorator模式解决什么问题?
2.实现Decorator模式
3.小结
#Decorator模式解决什么问题?
定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
java.io包也是基于此模式组织代码,学习Decorator代码能帮助理解IO包
#实现Decorator模式
为了练手,我们来模拟电脑外设接入电脑主机,也就是用外设来装饰电脑
首先定义一个Computer的抽象类
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-24
* @desc 定义被装饰者
*/
public abstract class Computer {
public abstract void connectingDevices();
}
被装饰者具体实现及初始信息
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-24
* @desc 定义被装饰者具体实现
*/
public class Desktop extends Computer {
public void connectingDevices() {
System.out.println("当前未连接任何外接设备");
}
}
装饰者
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-24
* @desc 定义装饰者
*/
public abstract class Decorator extends Computer {
public Computer computer;
public Decorator(Computer computer) {
this.computer = computer;
}
public void connectingDevices() {
computer.connectingDevices();
}
}
鼠标装饰类
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-23
* @desc 定义鼠标装饰
*/
public class DecoratorMouse extends Decorator {
public DecoratorMouse(Computer computer) {
super(computer);
}
@Override
public void connectingDevices() {
super.connectingDevices();
System.out.println("鼠标已经链接");
}
}
键盘装饰类
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-23
* @desc 定义键盘装饰器
*/
public class DecoratorKeybord extends Decorator {
public DecoratorKeybord(Computer computer) {
super(computer);
}
@Override
public void connectingDevices() {
super.connectingDevices();
System.out.println("键盘已经链接");
}
}
测试类
package com.mike.pattern.decorator.eg1;
/**
* @author mike
* @date 2020-11-23
* @desc 测试装饰
*/
public class Test {
public static void main(String[] args) {
Desktop desktop = new Desktop();
Decorator decorator = new DecoratorKeybord(new DecoratorMouse(desktop));
decorator.connectingDevices();
}
}
输出
#小结
学习设计模式最好的办法是先打好基础,尤其是有关,抽象类,接口方面的知识,加上多使用IDE断点调试功能,分析代码调用链,别人的文章只能给你指路,设计模式属于只能意会没法言传的一类知识,自己多思考,多敲代码才能体会其思想。
参考文章:https://blog.csdn.net/jason0539/article/details/22713711