一 模式背景
有些时候,我们希望在原有类的基础上,对功能进行增强或者减少,并且还要能够动态组合功能。我们抛开设计模式首先考虑到的是添加功能函数,或者是直接继承。很明显第一种方式是最low的,不符合开闭原则;第二种方式呢,如果使用继承,我们也肯定可以完成功能,而且效果比直接修改以前代码好很多,但是扩展性,灵活性还是差一些,如果有很多不同的组合或者搭配,整个继承体系变得臃肿。
二 装饰者模式(Decorator)
装饰者模式:就是可以动态给一个对象添加或者删除功能,而对于原对象来说是透明的,即原对象是感知不到装饰者的存在
装饰者模式类图如下:
装饰类和被装饰类都是独立的,互不影响,即被装饰类是不知道装饰类的存在的
public interface Robot {
void run();
}
public class FirstGenerationRobot implements Robot {
@Override
public void run() {
System.out.println("搜索");
System.out.println("唱歌");
}
}
/**
* 装饰器模式
* 第一: 实现或者继承被装饰的接口或者类
* 第二: 添加被装饰的类的字段,即对哪一个类的对象增强
*/
public abstract class RobotDecorator implements Robot{
public Robot robot;
public RobotDecorator(Robot robot) {
this.robot = robot;
}
@Override
public void run() {
this.robot.run();
}
public abstract void upgradeRun();
}
public class SecondGenerationRobot extends RobotDecorator {
public SecondGenerationRobot(Robot robot) {
super(robot);
}
@Override
public void upgradeRun() {
this.robot.run();
System.out.println("撩妹");
}
}
public class Client {
public static void main(String[] args) {
RobotDecorator robot = new SecondGenerationRobot(new FirstGenerationRobot());
robot.upgradeRun();
}
}