医院网站怎么做,那个外贸网站做的最好,百度普通下载,wordpress 转换app装饰模式就是对一个类进行装饰#xff0c;增强其方法行为#xff0c;在装饰模式中#xff0c;作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同#xff0c;否则就破坏了原有类的结构了#xff0c;所以装饰器模式要做到对被装饰类的使用者透明#xff0c;这…装饰模式就是对一个类进行装饰增强其方法行为在装饰模式中作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同否则就破坏了原有类的结构了所以装饰器模式要做到对被装饰类的使用者透明这是对装饰器模式的一个要求。总之装饰器设计模式就是对于原有功能的扩展 不改变原有代码基础之上 额外实现增强。装饰者模式是一种结构型设计模式它允许你在运行时为对象动态添加新的行为同时不改变其原有的结构。这种模式是作为替代继承的一种方式而存在的。 在装饰者模式中有一个抽象组件Component定义了基本功能并且可以有一个或多个具体组件ConcreteComponent实现这些基本功能。此外还有一个抽象装饰者Decorator类它也实现了抽象组件并且包含了一个指向抽象组件的引用。具体装饰者ConcreteDecorator类继承自抽象装饰者类并且可以在运行时为抽象组件添加新的行为。
装饰者模式Decorator Pattern是一种结构型设计模式它允许你动态地给对象添加职责功能。装饰者模式与继承不同它通过创建装饰者类来包装原始类而不是通过继承来扩展功能。装饰者模式在许多情况下非常有用特别是在需要组合功能或动态地调整功能的时候。 优点
灵活性通过组合不同的装饰器可以灵活地为对象添加不同的功能。遵循开闭原则不修改现有类的情况下扩展功能。细粒度控制可以对对象功能进行细粒度控制和组合。 缺点复杂性会增加系统的复杂性尤其是在有大量不同装饰器的时候。性能可能会增加系统的性能开销特别是在装饰器链比较长的情况下。 装饰者模式非常适合那些需要在不修改类定义的情况下动态地添加功能的场景。 装饰者模式的组成
装饰者模式主要包括以下几个部分 组件接口Component定义对象的接口可以是具体组件或装饰器共同实现的接口。 具体组件ConcreteComponent实现组件接口的基本功能对象。 装饰器抽象类Decorator实现组件接口并包含一个组件接口的引用可以是具体组件或另一个装饰器。 具体装饰器ConcreteDecorator继承装饰器抽象类添加额外的功能。 UML 类图
Component (接口)
^
|
ConcreteComponent (具体组件)
^
|
Decorator (装饰器抽象类)
^
|
ConcreteDecoratorA, ConcreteDecoratorB (具体装饰器)装饰者模式Decorator Pattern是一种结构型设计模式它允许你动态地给对象添加职责功能。装饰者模式与继承不同它通过创建装饰者类来包装原始类而不是通过继承来扩展功能。装饰者模式在许多情况下非常有用特别是在需要组合功能或动态地调整功能的时候。
UML 类图 Component (接口) ^ | ConcreteComponent (具体组件) ^ | Decorator (装饰器抽象类) ^ | ConcreteDecoratorA, ConcreteDecoratorB (具体装饰器)
java样例1
以下是一个简单的 Java 示例展示了如何使用装饰者模式
// 组件接口
public interface Coffee {String getDescription();double getCost();
}// 具体组件
public class SimpleCoffee implements Coffee {Overridepublic String getDescription() {return Simple coffee;}Overridepublic double getCost() {return 2.0;}
}// 装饰器抽象类
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee coffee;}Overridepublic String getDescription() {return decoratedCoffee.getDescription();}Overridepublic double getCost() {return decoratedCoffee.getCost();}
}// 具体装饰器A
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , Milk;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.5;}
}// 具体装饰器B
public class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , Sugar;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.2;}
}// 使用装饰者模式
public class DecoratorPatternDemo {public static void main(String[] args) {Coffee coffee new SimpleCoffee();System.out.println(coffee.getDescription() $ coffee.getCost());coffee new MilkDecorator(coffee);System.out.println(coffee.getDescription() $ coffee.getCost());coffee new SugarDecorator(coffee);System.out.println(coffee.getDescription() $ coffee.getCost());}
}运行结果 Simple coffee $2.0 Simple coffee, Milk $2.5 Simple coffee, Milk, Sugar $2.7 解释
组件接口Coffee定义了 getDescription 和 getCost 方法。具体组件SimpleCoffee实现了组件接口表示基本的咖啡。装饰器抽象类CoffeeDecorator实现了组件接口并持有一个组件接口的引用。具体装饰器MilkDecorator 和 SugarDecorator扩展了装饰器抽象类为咖啡添加额外的功能牛奶和糖。
Java样例2
下面是一个简单的装饰者模式的示例假设我们有一个接口 Shape 表示图形以及一个具体实现 Circle
public interface Shape {void draw();
}public class Circle implements Shape {Overridepublic void draw() {System.out.println(Drawing Circle);}
}
然后我们创建一个抽象装饰者 ShapeDecorator它也实现了 Shape 接口并且包含了一个指向 Shape 的引用
public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape) {this.decoratedShape decoratedShape;}public void draw() {decoratedShape.draw();}
}
接着我们可以创建具体的装饰者例如 RedShapeDecorator它继承自 ShapeDecorator 并且在原有的基础上添加新的行为
public class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}Overridepublic void draw() {decoratedShape.draw();setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape){System.out.println(Border Color: Red);}
}
最后我们可以使用装饰者模式来动态地为对象添加新的行为例如
public class DecoratorPatternDemo {public static void main(String[] args) {Shape circle new Circle();Shape redCircle new RedShapeDecorator(new Circle());System.out.println(Circle with normal border);circle.draw();System.out.println(\nCircle of red border);redCircle.draw();}
}在这个示例中RedShapeDecorator 动态地为 Circle 对象添加了红色边框的功能而不需要改变 Circle 类的代码。 装饰者模式的优点在于它能够灵活地扩展对象的功能而不需要修改现有的代码同时遵循了开放-封闭原则。但是过度使用装饰者模式可能会导致系统中出现大量的小类增加复杂性。因此在使用装饰者模式时需要权衡利弊。