Java设计模式之
装饰模式实验报告书

姓名:
班级:
学号:

实验三:装饰模式的应用
一、实验目的
熟练使用JAVA实现装饰模式,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验内容
实验1
购买咖啡时,也可以要求在其中加入各种调料
例如:
蒸奶(Steamed Milk)
豆浆(Soy)、
摩卡(Mocha,也就是巧克力风味)
调料3、调料4、调料5 ……
于是咖啡有加奶咖啡,加调料n咖啡……
实验2
某软件公司基于面向对象技术开发一套图形界面构件库VisualComponent,该构件库提供了大量的的基本构件,如窗体,文本框,列表框等,由于在使用该构件库什用户经常要求定制一些特殊的显示效果,如带滚动条的窗体,带黑色边框的文本框,既带滚动条又带黑色边框的列表框等,因此经常需要时对该构件库进行扩展,以增强其功能。用装饰模式来设计该图形界面构件库。
三、实验步骤
第一个实验
1.实例类图

2.实例代码
coffe1.java
packagedecorate.coffee;public class coffe1 extends coffee{
public double cost() {
System.out.println(“coffee1”);
return 1.0;
}
}
coffe2.java
package decorate.coffee;public class coffe2 extends coffee{
public double cost() {
System.out.println(“coffee2”);
return 2.0;
}
}
Coffee.java
package decorate.coffee;public abstract class coffee {
String description;public abstract double cost();
}
Milk.java
package decorate.coffee;public class Milk extends Peiliao{
public Milk(coffee c) {
super©;
System.out.println(“Milk”);}
public double cost() {
return 0.1+c.cost();
}}
Peiliao.java
package decorate.coffee;public abstract class Peiliao extends coffee{
String name;
coffee c;
public Peiliao(coffee c){
this.c=c;}
public abstract double cost();}
Soy.java
package decorate.coffee;public class Soy extends Peiliao{
public Soy(coffee c) {
super©;
System.out.println(“Soy”);
}
public double cost() {
return 0.2+c.cost();
}
}
Test.java
package decorate.coffee;public class Test {
public static void main (String[] args) {
coffee c1 = new coffe1();
Milk mc = new Milk(c1);
Milk mcc = new Milk(mc);
Soy s = new Soy(mcc);
System.out.println(“总计:$”+s.cost());
}
}
3.运行结果:第二个实验:
1.实例类图2.实例代码
BlackBorderDecorator.java
package decorate.VisualComponent;public class BlackBorderDecorator extends ComponentDecorator{
public BlackBorderDecorator(Component component) {
super(component);
}
public void display() {
this.setBlackBorder();
super.display();
}
public void setBlackBorder() {
System.out.println(“为构件增加黑色边框!”);
}
}
Client.java
package decorate.VisualComponent;public class Client {
public static void main(String args[]) {
Component component,componentSB,componentBB;
component = new Window();
componentSB = new ScrollBarDecorator(component);
componentBB = new BlackBorderDecorator(componentSB);
componentBB.display();
}
}
Component.java
package decorate.VisualComponent;public abstract class Component {
public abstract void display();
}
ComponentDecorator.java
package decorate.VisualComponent;public class ComponentDecorator extends Component{
private Component component;
public ComponentDecorator(Component component) {
this.component=component;
}
public void display() {
component.display();
}
}
ListBox.java
package decorate.VisualComponent;public class ListBox extends Component{
public void display(){
System.out.println(“显示列表框!”);
}
}
ScrollBarDecorator.java
package decorate.VisualComponent;public class ScrollBarDecorator extends ComponentDecorator{
public ScrollBarDecorator(Component component) {
super(component);
}
public void display() {
this.setScrollBar();
super.display();
}
public void setScrollBar() {
System.out.println(“为构件增加滚动条!”);
}
}
TextBox.java
package decorate.VisualComponent;public class TextBox extends Component{
public void display() {
System.out.println(“显示文本框!”);
}
}
Window.java
package decorate.VisualComponent;public class Window extends Component{
public void display() {
System.out.println(“显示窗体!”);
}
}


3.运行结果:

四、实验结果分析
1 装饰模式的设计意图
装饰模式降低了系统的耦合度,可以动态增加或删除对象的职责,并使需要装饰的具体构建和具体装饰的可以独立变化,以便增加新的具体构建和具体装饰的使用装饰模式,可以带来减少子类的个数,按系统扩展起来更加方便,更加可以维护。
2 装饰模式的结构

3 装饰模式的优点
1、对于拓展一个对象的功能,装饰模式比距城更加灵活,不会导致类的个数急剧增加。
2、可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装修类,从而实现不同的行为。
3、可以对一个对象进行多次装饰,通过使用不同的具体装饰的一级,这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更加强大的对象。
4、具体构件内与具体装室内可以独立变化。用户可以根据需要增加新的具体构建内核构件,装饰类。原有内裤代码无需改变,符合开闭原则。
4 装饰模式的缺点
1、在使用装饰模式进行系统设计时将产生很多小对象。这些对象的区别在于它们之间的相互连接的方式有所不同。那不是他们的类或者属性值有所不同,大量小对象的产生,势必会占有更多的系统资源,在一定程度上影响程序的性能。
2、装饰模式提供了一种比距城更加灵活机动的解决方案,但同时也意味着比距成更加男一女出错,排座椅面困难,对于多次装饰的对象,在调试时寻找错误,可能需要逐级排查,较为繁琐。

欢迎您关注我的个人微信公众号:学习微站(studysth)

Java设计模式之 装饰模式实验报告书_java