苏ICP备112451047180号-6
C#设计模式实验报告
一、实验目的
1.熟练使用面向对象设计原则对系统进行重构;
2.熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的创建型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和单例模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容
模式实例1
§ 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。使用桥接模式设计和实现来模拟毛笔的使用过程。
模式实例2
§ 在水果盘(Plate)中有一些水果,如苹果(Apple)、香蕉(Banana)、梨子(Pear),当然大水果盘中还可以有小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”方法,实际上就是吃其中的水果。使用组合模式设计类图并编程实现。
模式实例3
§ 变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。使用透明或者半透明装饰模式设计类图并编程实现。
三、实验要求
1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2. 结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式和单例模式的模式结构图;
3. 使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式和单例模式实例,代码运行正确无误。
四、实验步骤
实验一:模拟毛笔

实现代码:
package product;
public interface Color
{
public void bepaint(String penType , String name);
}
public abstract class Pen
{
protected Color color;
public void setColor(Color color)
{
this.color=color;
}
public abstract void draw(String name);
}
public class SmallPen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class MiddlePen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class BigPen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class Red implements Color
{
public void bepaint(String penType , String name);
}
public class Green implements Color
{
public void bepaint(String penType , String name);
}
public class Blue implements Color
{
public void bepaint(String penType , String name);
}
public class White implements Color
{
public void bepaint(String penType , String name);
}
public class Black implements Color
{
public void bepaint(String penType , String name);
}
实验二:水果盘
类图:

实现代码:
package product;
public abstract void eat();
}
public void eat(){
System.out.peintln("eat apple !");
}
}
public class Pear extends MyElement {
public void eat(){
System.out.println("eat pear !");
}
}
public class Banana extends MyElement{
public void eat(){
System.out.println("eat banana !");
}
}
private ArrayList list = new ArrayList();
public void add(MyElement element)
list.add(element);
}
public void delete(MyElement element{
list.delete(element);
}
public void eat(){
for(Object obj: list){
((MyElement)obj).eat();
}
}
}
public static void main(String[] args){
MyElement obj1, obj2, obj3, obj4, obj5;
Plate plate1, plate2, plate3;
obj1 = new Apple();
obj2 = new Pear();
plate1 = new Plate();
plate1.add(obj1);
Plate1.add(obj2);
obj3 = new Banana();
obj4 = new Banana();
plate2 = new Plate();
plate2.add(obj3);
plate2.add(obj4);
obj5 = new Apple();
plate3 = new Plate();
plate3.add(plate1);
plate3.add(plate2);
plate3.add(obj5);
plate3.eat();
}
}
实验三
类图:

实现代码
package product;
public interface Transform
{
public void move();
}
public final class Car implements Transform
{
public Car()
{
System.out.println("变形金刚是一辆车!");
}
public void move()
{
System.out.println("在陆地上移动!");
}
}
public class Changer implements Transform
{
private Transform transform;
public Changer(Transform transform)
{
this.transform=transform;
}
public void move()
{
transform.move();
}
}
public class Robot extends Changer
{
public Robot(Transform transform)
{
super(transform);
System.out.println("变成机器人!");
}
public void say()
{
System.out.println("说话!");
}
}
public class Airplane extends Changer
{
public Airplane(Transform transform)
{
super(transform);
System.out.println("变成飞机!");
}
public void fly()
{
System.out.println("在天空飞翔!");
}
}
public class Client
{
public static void main(String args[])
{
Transform camaro;
camaro=new Car();
camaro.move();
System.out.println("-----------------------------");
Airplane bumblebee=new Airplane(camaro);
bumblebee.move();
bumblebee.fly();
}
}
五、实验结果
实验一:

实验二:

实验三:

六、实验分析
实验一:在蜡笔中,颜色和型号两个不同的变化维度(即两个不同的变化原因)融合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响另一个维度;但在毛笔中,颜色和型号实现了分离,增加新的颜色或者型号对另一方都没有任何影响。如果使用软件工程中的术语,我们可以认为在蜡笔中颜色和型号之间存在较强的耦合性,而毛笔很好地将二者解耦,使用起来非常灵活,扩展也更为方便。
实验二:组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象,这就是组合模式的模式动机。
实验三:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类).
一、实验目的
1.熟练使用面向对象设计原则对系统进行重构;
2.熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的创建型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和单例模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容
模式实例1
§ 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。使用桥接模式设计和实现来模拟毛笔的使用过程。
模式实例2
§ 在水果盘(Plate)中有一些水果,如苹果(Apple)、香蕉(Banana)、梨子(Pear),当然大水果盘中还可以有小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”方法,实际上就是吃其中的水果。使用组合模式设计类图并编程实现。
模式实例3
§ 变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。使用透明或者半透明装饰模式设计类图并编程实现。
三、实验要求
1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2. 结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式和单例模式的模式结构图;
3. 使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式和单例模式实例,代码运行正确无误。
四、实验步骤
实验一:模拟毛笔

实现代码:
package product;
public interface Color
{
public void bepaint(String penType , String name);
}
public abstract class Pen
{
protected Color color;
public void setColor(Color color)
{
this.color=color;
}
public abstract void draw(String name);
}
public class SmallPen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class MiddlePen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class BigPen extends Pen
{
public void draw(String name)
{
//代码
color.bepaint(String penType , String name);
//代码
}
}
public class Red implements Color
{
public void bepaint(String penType , String name);
}
public class Green implements Color
{
public void bepaint(String penType , String name);
}
public class Blue implements Color
{
public void bepaint(String penType , String name);
}
public class White implements Color
{
public void bepaint(String penType , String name);
}
public class Black implements Color
{
public void bepaint(String penType , String name);
}
实验二:水果盘
类图:

实现代码:
package product;
//抽象结构
public abstract class MyElement {public abstract void eat();
}
//叶子结构
public class Apple extends MyElement{public void eat(){
System.out.peintln("eat apple !");
}
}
public class Pear extends MyElement {
public void eat(){
System.out.println("eat pear !");
}
}
public class Banana extends MyElement{
public void eat(){
System.out.println("eat banana !");
}
}
//容器结构
public class Plate extends MyElement{private ArrayList list = new ArrayList();
public void add(MyElement element)
list.add(element);
}
public void delete(MyElement element{
list.delete(element);
}
public void eat(){
for(Object obj: list){
((MyElement)obj).eat();
}
}
}
//客户端
pubic class Client{public static void main(String[] args){
MyElement obj1, obj2, obj3, obj4, obj5;
Plate plate1, plate2, plate3;
obj1 = new Apple();
obj2 = new Pear();
plate1 = new Plate();
plate1.add(obj1);
Plate1.add(obj2);
obj3 = new Banana();
obj4 = new Banana();
plate2 = new Plate();
plate2.add(obj3);
plate2.add(obj4);
obj5 = new Apple();
plate3 = new Plate();
plate3.add(plate1);
plate3.add(plate2);
plate3.add(obj5);
plate3.eat();
}
}
实验三
类图:

实现代码
package product;
public interface Transform
{
public void move();
}
public final class Car implements Transform
{
public Car()
{
System.out.println("变形金刚是一辆车!");
}
public void move()
{
System.out.println("在陆地上移动!");
}
}
public class Changer implements Transform
{
private Transform transform;
public Changer(Transform transform)
{
this.transform=transform;
}
public void move()
{
transform.move();
}
}
public class Robot extends Changer
{
public Robot(Transform transform)
{
super(transform);
System.out.println("变成机器人!");
}
public void say()
{
System.out.println("说话!");
}
}
public class Airplane extends Changer
{
public Airplane(Transform transform)
{
super(transform);
System.out.println("变成飞机!");
}
public void fly()
{
System.out.println("在天空飞翔!");
}
}
public class Client
{
public static void main(String args[])
{
Transform camaro;
camaro=new Car();
camaro.move();
System.out.println("-----------------------------");
Airplane bumblebee=new Airplane(camaro);
bumblebee.move();
bumblebee.fly();
}
}
五、实验结果
实验一:

实验二:

实验三:

六、实验分析
实验一:在蜡笔中,颜色和型号两个不同的变化维度(即两个不同的变化原因)融合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响另一个维度;但在毛笔中,颜色和型号实现了分离,增加新的颜色或者型号对另一方都没有任何影响。如果使用软件工程中的术语,我们可以认为在蜡笔中颜色和型号之间存在较强的耦合性,而毛笔很好地将二者解耦,使用起来非常灵活,扩展也更为方便。
实验二:组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象,这就是组合模式的模式动机。
实验三:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类).