装饰模式是为了在已有的功能上添加额外的功能的一种方式,对已经有的方法再进行装饰
应用场景:当需求是需要向系统中,旧代码中添加新的代码时使用,比如以前的代码是发送一个接口请求,这个时候你需要为其进行加密,获取敏感词过滤,就可以使用装饰模式,对之前的旧的方法(就一个请求)进行装饰。这样就不会修改原来的代码。但是最好是使用装饰的时候,是独立的模块,不会因为顺序而影响的模块。
抽象的对象
package 结构;
/**
* @Program: 设计模式
* @Description: 对象接口,可以为其动态的添加一些功能
* @Author Mokairui
* @Date 2020/12/2 20:12
*/
public interface Component {
/**
* 一个接口方法功能
*/
void operation();
}
具体的对象
package 结构;
/**
* @Program: 设计模式
* @Description: 一个具体的对象,可以为这个具体的对象添加具体的操作
* @Author Mokairui
* @Date 2020/12/2 20:20
*/
public class CreateComponent implements Component {
@Override
public void operation() {
System.out.println("具体对象的操作");
}
}
装饰对象
package 结构;
/**
* @Program: 设计模式
* @Description: 实现Component类,从外部扩展Component的功能
* @Author Mokairui
* @Date 2020/12/2 20:21
*/
public abstract class Decorator implements Component {
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if (null != component) {
component.operation();
}
}
}
具体的装饰对象
package 结构;
/**
* @Program: 设计模式
* @Description: 具体的装饰对象,起到给Component添加职责的功能
* @Author Mokairui
* @Date 2020/12/2 20:33
*/
public class CreateDecorateA extends Decorator {
// 用户区别装饰对象B
private String addState;
@Override
public void operation() {
super.operation();
addState = "New State";
System.out.println("具体装饰对象A的操作");
}
}
package 结构;
/**
* @Program: 设计模式
* @Description: 具体的装饰对象,起到给Component添加职责的功能
* @Author Mokairui
* @Date 2020/12/2 20:34
*/
public class CreateDecoratorB extends Decorator {
@Override
public void operation() {
super.operation();
test();
System.out.println("具体装饰对象B的操作");
}
// 用于区别装饰对象A
public void test() {
}
}
在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。
Person类
package example;
/**
* @Program: 设计模式
* @Description: 结构中的CreateComponent类
* @Author Mokairui
* @Date 2020/12/3 19:02
*/
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println("装扮衣服的" + name);
}
}
Finery服饰类,也就是装饰类
package example;
/**
* @Program: 设计模式
* @Description: 服饰类
* @Author Mokairui
* @Date 2020/12/3 19:07
*/
public class Finery extends Person {
protected Person component;
// 装饰
public void Decorate(Person component) {
this.component = component;
}
@Override
public void show() {
if (null != component) {
component.show();
}
}
}
具体的装饰对象
package example;
/**
* @Program: 设计模式
* @Description: 具体的服饰类
* @Author Mokairui
* @Date 2020/12/3 19:24
*/
public class TShirts extends Finery {
@Override
public void show() {
System.out.print("大T恤");
super.show();
}
}
package example;
/**
* @Program: 设计模式
* @Description: 具体的服饰类,装饰类
* @Author Mokairui
* @Date 2020/12/3 19:27
*/
public class BigTrouser extends Finery {
@Override
public void show() {
System.out.print("打跨裤");
super.show();
}
}
测试
package example;
/**
* @Program: 设计模式
* @Description: 测试类
* @Author Mokairui
* @Date 2020/12/3 19:28
*/
public class Demo {
public static void main(String[] args) {
Person person = new Person("马儿扎哈");
TShirts ts = new TShirts();
BigTrouser bt = new BigTrouser();
ts.Decorate(person);
ts.show();
System.out.println("------------------");
bt.Decorate(person);
bt.show();
System.out.println("-------------------");
ts.Decorate(person);
bt.Decorate(ts);
bt.show();
}
}
在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。
原文:https://www.cnblogs.com/mokairui/p/14076833.html