合肥比较好的网站制作,美食网页设计论文5000字,腾讯云 wordpress教程视频,网站建设模板代理在现实生活中我们的汽车都具备跑的功能#xff0c;我们可以不改变汽车原有功能的前提下#xff0c;把它放入一个装修厂#xff0c;开进去让里面给咱们的车子做一些装饰#xff0c;开出来之后呢#xff0c;就具备了上天的功能了(技术可达是可以的哈)#xff0c;这就给原来…在现实生活中我们的汽车都具备跑的功能我们可以不改变汽车原有功能的前提下把它放入一个装修厂开进去让里面给咱们的车子做一些装饰开出来之后呢就具备了上天的功能了(技术可达是可以的哈)这就给原来的汽车对象增加了额外的功能。再举一个例子假设我们非常爱惜一张照片我们可以不改变照片本身前提下给它增加一个相框使得它具有防潮的功能而且用户可以根据需要给它增加不同类型的相框甚至可以在一个小相框的外面再套一个大相框。这就是针对照片这个对象的装饰在软件工程中同样存在类似的功能使用装饰模式可以透明的增加指定对象的功能。1、装饰模式的引入首先咱们来看一段代码假设我要设计一个汽车类然后在里面定义了汽车可能存在的功能(后面我还要扩展汽车的功能)public class Car {public void run(){System.out.println(能跑);}public void fly(){System.out.println(能飞);}public void sweep(){System.out.println(能游);}public void show(){System.out.println(该汽车拥有的功能);this.run();this.fly();this.sweep();}}public class Main {public static void main(String[] args) {Car bus new Car();bus.show();}}这段代码并没有什么设计可言的。运行结果就不贴出来了可见我们在客户端造了一个巴士调用了巴士的 show 方法后发现有一些功能并不是巴士的(飞、游泳)这样显然是存在问题的。那么我们可能会作如下修改使用继承每个继承体系归类。//接口可以改为抽象类public interface Car {//只要是有汽车都具备跑的功能void run();//调用展示该汽车存在的功能void show();}public class RunCar implements Car{//普通汽车只具备跑的功能public void run() {System.out.println(可以跑);}public void show() {this.run();}}public class FlyCar implements Car {//扩展的汽车具备飞的功能Overridepublic void run() {System.out.println(可以跑);}// 定义自己的功能public void fly() {System.out.println(可以飞);}Overridepublic void show() {this.run();this.fly();}}public class SwimCar implements Car{//扩展的汽车具备游泳的功能Overridepublic void run() {System.out.println(可以跑);}public void swim(){System.out.println(可以游泳);}Overridepublic void show() {this.run();this.swim();}}然后在客户端调用public class Main {public static void main(String[] args) {Car bus new RunCar();bus.show();Car flyCar new FlyCar();flyCar.show();}}运行结果如下我们这里使用继承的方式来扩展系统(Car)的功能这样拥有了设计可言但是还是存在问题的。问题在于如果增加子类他拥有“遁地”的功能的话(当然技术先进可以做到哈不要在意这些细节)仍然要在遁地这个子类里面定义额外的“遁地”方法。这个时候为了解决这种继承扩展功能问题就引入了本节的内容——装饰模式。装饰模式是扩展系统功能的最佳选择。装饰模式是对已有对象的功能进行扩展(装修、装饰)以获得更加符合用户需求的对象使得对象具有更加强大的功能。2、装饰模式概述装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为在现实生活中这种情况也到处存在例如装修窗户我们可以不改变窗户本身给它增加一些额外的装饰(比如窗花)增加他的可观赏性而且用户可以根据需要给它增加不同类型的窗花甚至可以装饰多层。装饰模式是一种用于替代继承的技术它通过一种无须定义子类的方式来给对象动态增加职责使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类在装饰类中既可以调用待装饰的原有类的方法还可以增加新的方法以扩充原有类的功能。装饰模式定义如下动态地给一个对象增加一些额外的职责就增加对象功能来说装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。在装饰模式中为了让系统具有更好的灵活性和可扩展性我们通常会定义一个抽象装饰类而将具体的装饰类作为它的子类装饰模式结构如图所示在装饰模式结构图中包含如下几个角色Component(抽象构件)它是具体构件和抽象装饰类的共同父类声明了在具体构件中实现的业务方法它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象实现客户端的透明操作。【上述 Car 就是这个角色】ConcreteComponent(具体构件)它是抽象构件类的子类用于定义具体的构件对象实现了在抽象构件中声明的方法装饰器可以给它增加额外的职责(方法)。【上述 RunCar 就是这个角色】Decorator(抽象装饰类)它也是抽象构件类的子类用于给具体构件增加职责但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用通过该引用可以调用装饰之前构件对象的方法并通过其子类扩展该方法以达到装饰的目的。比如针对开头的案例它可以对 Car 增加除了跑额外的功能 “可以游泳”、“下水”、“遁地”等。ConcreteDecorator(具体装饰类)它是抽象装饰类的子类负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为它可以调用在抽象装饰类中定义的方法并可以增加新的方法用以扩充对象的行为。【上述 FlyCar 和 SwinCar 可以作为整个角色对 Car 动能进行扩展】由于具体构件类和装饰类都实现了相同的抽象构件接口因此装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任换言之客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下将对象的功能加以扩展。装饰模式的核心在于抽象装饰类的设计其典型代码如下所示class Decorator implements Component{//持有抽象构件的引用private Component component;//注入一个抽象构件类型的对象(依赖倒置)public Decorator(Component component) {this.componentcomponent;}public void operation(){//调用原有业务方法component.operation();}}在抽象装饰类 Decorator 中定义了一个 Component 类型的对象 component维持一个对抽象构件对象的引用并可以通过构造方法或 Setter 方法将一个 Component 类型的对象注入进来同时由于 Decorator 类实现了抽象构件 Component 接口因此需要实现在其中声明的业务方法 operation()需要注意的是在 Decorator 中并未真正实现 operation() 方法而只是调用原有 component 对象的 operation() 方法它没有真正实施装饰而是提供一个统一的接口将具体装饰过程交给子类完成。在 Decorator 的子类即具体装饰类中将继承 operation() 方法并根据需要进行扩展典型的具体装饰类代码如下class ConcreteDecorator extends Decorator{public ConcreteDecorator(Component component){super(component);}public void operation(){super.operation(); //调用原有业务方法addedBehavior(); //调用新增业务方法}//新增业务方法public void addedBehavior(){……}}在具体装饰类中可以调用到抽象装饰类的 operation() 方法同时可以定义新的业务方法如 addedBehavior()。由于在抽象装饰类 Decorator 中注入的是 Component 类型的对象因此我们可以将一个具体构件对象注入其中再通过具体装饰类来进行装饰此外我们还可以将一个已经装饰过的 Decorator 子类的对象再注入其中进行多次装饰从而对原有功能的多次扩展。3、装饰模式实战针对文章开头处的案例使用装饰设计模式进行修改。对于装饰模式可以难于理解的地方在于 Decorator 抽象装饰类为何会继承或者实现 Component 抽象构建类。如果我们不继承 Component 构建类使用装饰模式的时候代码如下UML图代码java//Component抽象构件角色public interface Car {//只要是有汽车都具备跑的功能