广州手机网站建设价格,名城苏州网首页,用python做网站多吗,网站设计公司域名服务器建设概述
当我们编写软件时#xff0c;有时我们会遇到需要在不修改现有代码的情况下添加新功能的情况。这时#xff0c;我们可以使用装饰器模式。
装饰器模式是一种结构性设计模式#xff0c;它允许我们在不改变对象接口的情况下动态地向对象添加功能。装饰器模式通过创建一个…概述
当我们编写软件时有时我们会遇到需要在不修改现有代码的情况下添加新功能的情况。这时我们可以使用装饰器模式。
装饰器模式是一种结构性设计模式它允许我们在不改变对象接口的情况下动态地向对象添加功能。装饰器模式通过创建一个包装对象来实现这一目的。这个包装对象具有与原始对象相同的接口但可以通过添加或覆盖方法来扩展或修改其行为。
装饰器模式通常用于以下情况
在运行时动态地向对象添加新功能而不会影响其他对象。在不改变现有代码的情况下添加新功能。以层次结构方式组合对象以获得更大的灵活性。
代码示例
下面是一个使用Java实现的装饰器模式的示例以模拟咖啡店销售咖啡的过程。 首先我们定义一个接口 Coffee表示咖啡的基本特性包括名称和价格
public interface Coffee {String getDescription();double getCost();
}然后我们定义一个具体的咖啡类 SimpleCoffee它实现了 Coffee 接口
public class SimpleCoffee implements Coffee {Overridepublic String getDescription() {return Simple coffee;}Overridepublic double getCost() {return 1.0;}
}这个类表示最简单的咖啡没有任何装饰。
接下来我们定义一个装饰器类 CoffeeDecorator它也实现了 Coffee 接口但是它包含一个 Coffee 类型的成员变量 decoratedCoffee
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee decoratedCoffee) {this.decoratedCoffee decoratedCoffee;}Overridepublic String getDescription() {return decoratedCoffee.getDescription();}Overridepublic double getCost() {return decoratedCoffee.getCost();}
}这个类的作用是让子类可以方便地覆盖 getDescription() 和 getCost() 方法以添加额外的装饰。 接下来我们定义两个具体的装饰器类Milk 和 Whip它们分别添加牛奶和奶泡
public class Milk extends CoffeeDecorator {public Milk(Coffee decoratedCoffee) {super(decoratedCoffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , Milk;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.5;}
}public class Whip extends CoffeeDecorator {public Whip(Coffee decoratedCoffee) {super(decoratedCoffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , Whip;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.7;}
}这些类都是 CoffeeDecorator 的子类它们实现了自己的 getDescription() 和 getCost() 方法来添加额外的功能。
最后我们可以使用这些类来创建不同类型的咖啡例如
Coffee simpleCoffee new SimpleCoffee();
System.out.println(simpleCoffee.getDescription() $ simpleCoffee.getCost());Coffee coffeeWithMilk new Milk(new SimpleCoffee());
System.out.println(coffeeWithMilk.getDescription() $ coffeeWithMilk.getCost());Coffee coffeeWithMilkAndWhip new Whip(new Milk(new SimpleCoffee()));
System.out.println(coffeeWithMilkAndWhip.getDescription() $ coffeeWithMilkAndWhip.getCost());JDK中的应用
在 Java IO 库中许多类都使用了装饰器模式来提供更高级的功能。这些类都是在基本的输入和输出类之上建立的通过使用不同的装饰器来组合它们从而实现了各种不同的功能。
例如BufferedReader 和 BufferedWriter 类就是基于装饰器模式实现的。BufferedReader 类是 Reader 类的一个装饰器它提供了缓冲输入的功能。当我们需要从一个输入流中读取数据时BufferedReader 将输入流中的数据读取到缓冲区中然后逐个字符地返回它们。这样做的好处是可以减少系统调用从而提高效率。
以下是一个使用 BufferedReader 类的示例
FileReader fileReader new FileReader(file.txt);
BufferedReader bufferedReader new BufferedReader(fileReader);String line;
while ((line bufferedReader.readLine()) ! null) {System.out.println(line);
}bufferedReader.close();
fileReader.close();在这个例子中我们首先创建了一个 FileReader 对象来读取文件然后将其传递给 BufferedReader 的构造函数。BufferedReader 对象使用 FileReader 对象作为其输入源并提供了缓冲输入的功能。在 while 循环中我们使用 readLine() 方法逐行读取文件并打印每一行。
类似的BufferedWriter 类也是 Writer 类的一个装饰器它提供了缓冲输出的功能。当我们需要将数据写入到一个输出流中时BufferedWriter 将数据写入到缓冲区中直到缓冲区满或者我们调用 flush() 方法时才将缓冲区中的数据写入到输出流中。
以下是一个使用 BufferedWriter 类的示例
FileWriter fileWriter new FileWriter(file.txt);
BufferedWriter bufferedWriter new BufferedWriter(fileWriter);bufferedWriter.write(Hello, world!);
bufferedWriter.newLine();
bufferedWriter.write(How are you?);bufferedWriter.close();
fileWriter.close();在这个例子中我们首先创建了一个 FileWriter 对象来写入文件然后将其传递给 BufferedWriter 的构造函数。BufferedWriter 对象使用 FileWriter 对象作为其输出目标并提供了缓冲输出的功能。我们使用 write() 方法将字符串写入到缓冲区中并使用 newLine() 方法添加一个新行。在最后我们调用 close() 方法来关闭 BufferedWriter 和 FileWriter 对象。
通过使用装饰器模式Java IO 库中的类可以轻松地组合成各种不同的输入和输出组合以提供更高级的功能。
类图
当使用装饰器模式时通常需要定义以下四种角色
抽象组件Component定义了被装饰对象的基本接口。可以是一个抽象类或者接口。在 Java 中它通常是一个接口。
具体组件Concrete Component实现了抽象组件接口的具体对象也是被装饰的对象。
抽象装饰器Decorator维持一个指向抽象组件对象的引用并定义了与抽象组件接口一致的接口。
具体装饰器Concrete Decorator向装饰对象添加额外的职责或行为。 其中Component 定义了被装饰对象的基本接口。ConcreteComponent 实现了 Component 接口也就是被装饰的对象。Decorator 是一个抽象类它维持一个指向 Component 对象的引用并定义了与 Component 接口一致的接口。ConcreteDecoratorA 和 ConcreteDecoratorB 分别是具体的装饰器类它们继承自 Decorator 类并向被装饰对象添加额外的职责或行为。
通过组合不同的具体组件和具体装饰器可以创建出许多不同的对象从而提供了灵活而且可扩展的设计。