采样电阻,取样电阻欢迎您!

漫画设计模式:什么是“装饰器模式”?

首页 > 资讯

——————第2天———————————————————装饰器模式包括哪些核心角色? 1. Component接口在上面的示例中,Component接口等效于car接口,并且所有包装类和包装类都从该接口继承。

2. ConcreteComponent类ConcreteComponent类是一个打包的实现类。

在示例中,梅赛德斯·奔驰,宝马和特斯拉都属于这个角色。

3.  Decorator抽象类的所有包装类都从Decorator抽象类继承,并且Decorator类实现Component接口。

这样做是为了实现多层嵌套包装。

4. ConcreteDecorator类是一个特定的包装类,用于扩展包装类的功能,例如示例中的自动驾驶功能和飞行功能扩展。

这四个核心角色之间有什么关系?我们可以使用装饰器模式的UML类图来表达:第一个是car接口,它是Component的角色,它定义了run的行为:public interface Car {void run();}接下来是实现类别的各种汽车,即ConcreteComponent的角色,不同的汽车具有不同的运行行为实现:公共类BenzCar实现Car {@Override public void run(){& nbsp;& nbsp;& nbsp ;& nbsp;& nbsp;& nbsp; System.out .println(“奔驰在开车!”);& nbsp;& nbsp;& nbsp;& nbsp;} }公共类BmwCar实现Car {@Override public void run(){& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; System.out .println(“ BMW正在行驶!”);& nbsp;& nbsp;& nbsp;& nbsp;}}公共类TeslaCar实现Car {@Override public void run(){& nbsp;& ;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; System.out.pri ntln(“特斯拉在开车!”); & nbsp;& nbsp;& nbsp;}}下面是装饰器的抽象类,它是Decorator角色,其中包含Decorated成员对象:公共类CarDecorator实现Car {protected Car&decoratedCar; public CarDecorator(Car& nbsp; decoratedCar){this.decoratedCar& nbsp; =& nbsp;& nbsp;& nbsp;& nbsp;} public void run(){& nbsp; & nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; decoratedCar.run();& nbsp;& nbsp;& nbsp;& nbsp; }}有人可能会奇怪为什么装饰器类也实现了Car接口?这是装饰器模式的灵活性。

继承自Car接口的每个装饰器本身也可以由一个更外部的装饰器包装。

包装方法是将Car对象作为参数传递给外部装饰器的构造函数。

接下来是混凝土装饰器实现类,它是ConcreteDecorator角色。

这些装饰器还实现了运行行为。

一方面,他们将调用包装对象的run方法,另一方面,他们将执行一些扩展的操作(例如自动驾驶和飞行):公共类AutoCarDecorator扩展CarDecorator {public AutoCarDecorator(Car& decoratedCar) {super(decoratedCar);& nbsp;& nbsp;& nbsp;} @Override public void run(){& nbsp;& nbsp;& nbsp;& nbsp;& nbsp ;& nbsp;& nbsp; decoratedCar.run();& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp ; autoRun();& nbsp;& nbsp;& nbsp;} private void autoRun(){& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& n;  & nbsp; System.out。

println(“ Enable Autopilot”); & nbsp;& nbsp; }}公共类FlyCarDecorator扩展了CarDecorator {public FlyCarDecorator(Car& nbsp; decoratedCar){super(decoratedCar);& } @Override public void run(){& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp ;& decoratedCar.run();& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; fly();& nbsp ;& nbsp;& nbsp;} private void fly(){& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& n; System.out.println(“打开飞行汽车模式”); }}最后,我们的客户端类。

客户端类负责创建打包的对象和修饰符,并决定如何打包和执行:public class Client {public static void main(String []& nbsp; args){& nbsp;& nbsp;&  & nbsp;   汽车  benzCar  = new BenzCar();& nbsp;& nbsp;& nbsp;& n nbsp;& nbsp;& nbsp;& nbsp; = new BmwCar();& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;  & nbsp;& nbsp;汽车  teslaCar& nbs

cache