设计模式实验报告范文.docx
- 文档编号:8995509
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:30
- 大小:25.04KB
设计模式实验报告范文.docx
《设计模式实验报告范文.docx》由会员分享,可在线阅读,更多相关《设计模式实验报告范文.docx(30页珍藏版)》请在冰豆网上搜索。
设计模式实验报告范文
《设计模式》实验指导书
10 学时
教师:
张凯
实验一 工厂模式的应用
【实验目的】
1) 掌握工厂模式(Factory)的特点
2) 分析具体问题,使用工厂模式进行设计。
【实验内容和要求】
有一个 OEM 制造商代理做 HP 笔记本电脑(Laptop),后来该制造商得到了
更多的品牌笔记本电脑的订单 Acer,Lenovo,Dell,该 OEM 商发现,如果一
次同时做很多个牌子的本本,有些不利于管理。
利用工厂模式改善设计,用 C#
控制台应用程序实现该 OEM 制造商的工厂模式。
绘制该模式的 UML 图。
【模式UML图】
【模式代码(JAVA 语言实现)】
public class FactoryMethod {
public static void main(String[] args) {
Computer c;
Factory f=new DellFactory();
c=f.getComputerType();
c.ComputerType();
f=new LenovoFactory();
c=f.getComputerType();
c.ComputerType();
f=new AcerFactory();
c=f.getComputerType();
c.ComputerType();
}
}
interface Factory{
Computer getComputerType();
}
class DellFactory implements Factory{
@Override
public Computer getComputerType() {
return new Dell();
}
}
class AcerFactory implements Factory{
@Override
public Computer getComputerType() {
return new Acer();
}
}
class LenovoFactory implements Factory{
@Override
public Computer getComputerType() {
return new Lenovo();
}
}
/**
* 电脑品牌
*/
interface Computer{
public void ComputerType();
}
class Dell implements Computer{
@Override
public void ComputerType() {
// TODO Auto-generated method stub
System.out.println("Dell Computer");
}
}
class Acer implements Computer{
@Override
public void ComputerType() {
System.out.println("Acer Computer");
}
}
class Lenovo implements Computer{
@Override
public void ComputerType() {
// TODO Auto-generated method stub
System.out.println("Lenovo Computer");
}
}
【运行截图】
【实验小结】
通过本次实验,学会了使用工厂方法模式。
工厂方法模式的适用性如下:
当一个类不知道它所必须创建的对象的类时。
当一个类希望由它的子类来指定它所创建的对象时。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪
一个帮助子类是代理这一信息局部化时。
实验二 抽象工厂模式的应用
【实验目的】
1) 掌握抽象工厂模式(Abstract Factory)的特点
2) 分析具体问题,使用抽象工厂模式进行设计。
【实验内容和要求】
麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和
可乐(Cola),用 C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模
式。
绘制该模式的 UML 图。
【模式 UML 图】
【模式代码】
public class AbstractFactoryTest {
public static void main(String[] args) {
Hamburg h;
Cola c;
AbstractFactory af=new MDNFactory();
h=af.createHamburg();
c=af.createCola();
h.getHumburg();
c.getCola();
af=new KDJFactory();
h=af.createHamburg();
c=af.createCola();
h.getHumburg();
c.getCola();
}
}
interface AbstractFactory{
Hamburg createHamburg();
Cola createCola();
}
class MDNFactory implements AbstractFactory {
@Override
public Hamburg createHamburg() {
return new MDNHamburg();
}
@Override
public Cola createCola() {
return new MDNCola();
}
}
class KDJFactory implements AbstractFactory{
@Override
public Hamburg createHamburg() {
return new KDJHamburg();
}
@Override
public Cola createCola() {
return new KDJCola();
}
}
/**
* kDJ &MDN
*/
interface Hamburg{
void getHumburg();
}
class MDNHamburg implements Hamburg{
@Override
public void getHumburg() {
System.out.println("MDNHamburg");
}
}
class KDJHamburg implements Hamburg{
@Override
public void getHumburg() {
// TODO Auto-generated method stub
System.out.println("KDJHamburg");
}
}
interface Cola{
void getCola();
}
class MDNCola implements Cola{
@Override
public void getCola() {
System.out.println("MDNCola");
}
}
class KDJCola implements Cola{
@Override
public void getCola() {
System.out.println("KDJCola");
}
}
【运行截图】
【实验小结】
抽象工厂模式主要适用于以下情况:
一系列要独立于它的产品的创建、组合和表示时。
、
一个系统要由多个产品系列中的一个来配置时。
当要强调一系列相关的产品对象的设计以便进行联合使用时。
当要提供一个产品类库,而只要显示它们的接口而不是实现时。
实验三 适配器模式的应用
【实验目的】
1) 掌握适配器模式(Adapter)的特点
2) 分析具体问题,使用适配器模式进行设计。
【实验内容和要求】
一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),
线对象(Line)都支持 Draw()函数,即可以通过 Draw()函数绘制图形。
为了加快
项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。
但合作团队将角
度对象绘制函数定为了 DrawAngle()。
绘图系统提供给用户后,用户不满意,希
望能统一的调用,不用记太多命令。
应用适配器模式,用 C#控制台应用程序完
善该设计。
绘制该模式的 UML 图。
【模式UML图】
【模式代码】
public class AdapterTest {
public static void main(String[] args) {
Paint a=new AngleAdapter();
a.draw();
}
}
interface Paint{
void draw();
}
class Circle implements Paint{
@Override
public void draw() {
System.out.println("圆圆");
}
}
class Rectangle implements Paint{
@Override
public void draw() {
System.out.println("方方");
}
}
class Line implements Paint{
@Override
public void draw() {
System.out.println("线线");
}
}
class Angle{
public void DrawAngle(){
System.out.println("角度");
}
}
class AngleAdapter implements Paint{
private Angle a=new Angle();
@Override
public void draw() {
// TODO Auto-generated method stub
a.DrawAngle();
}
}
【运行截图】
【实验小结】
适配器模式主要适用于以下情况:
当想要使用一个已经存在的类,但是该类的接口不符合现有的需求时。
当需要创建一个可以被复用的类,该类能够与其他无关的类甚至无法预见
的类协同工作时。
当需要使用一个已经存在的子类,但是不可能对所有的都进行子类化以匹
配他们的接口时,对象适配器可以对其父类接口进行适配。
实验四 桥接模式的应用
【实验目的】
1) 掌握桥接模式(Bridge)的特点
2) 分析具体问题,使用桥接模式进行设计。
【实验内容和要求】
一个咖啡店可以提供大杯(JorumCoffee)、中杯(MediumCoffee)、小杯
(SmallCoffee)的咖啡(Coffee),为了满足不同用户的口味,在咖啡中可以添加牛
奶(Milk),或者糖(Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如
大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。
应用桥
接模式,用 C#控制台应用程序实现该设计。
绘制该模式的 UML 图。
【模式类图】
【模式代码】
package Constructor;
public class BridgeTest {
public static void main(String[] args) {
Bridge b;
b=new Sugar();
b.setCoffee(new JorumCoffee());
b.getCoffee();
b=new Milk();
b.setCoffee(new SmallCoffee());
b.getCoffee();
}
}
interface Coffee{
void getCoffee();
}
class JorumCoffee implements Coffee{
@Override
public void getCoffee() {
// TODO Auto-generated method stub
System.out.print("大杯咖啡");
}
}
class MediumCoffee implements Coffee{
@Override
public void getCoffee() {
// TODO Auto-generated method stub
System.out.print("中杯咖啡");
}
}
class SmallCoffee implements Coffee{
@Override
public void getCoffee() {
// TODO Auto-generated method stub
System.out.print("小杯咖啡");
}
}
/**
* 配料
*/
abstract class Bridge{
protected Coffee c;
void setCoffee(Coffee co){
c=co;
}
public void getCoffee(){
c.getCoffee();
}
}
class Sugar extends Bridge{
@Override
public void getCoffee(){
c.getCoffee();
System.out.println("加糖");
}
}
class Milk extends Bridge{
@Override
public void getCoffee(){
c.getCoffee();
System.out.println("加牛奶");
}
}
class Lemon extends Bridge{
@Override
public void getCoffee(){
c.getCoffee();
System.out.println("加柠檬");
}
}
【运行截图】
【实验小结】
桥接模式的适用情况有:
当不希望在抽象和它的实现之间有一个固定的绑定关系时。
当类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充时。
当对一个抽象类的实现部分的修改应对客户不产生影响时。
实验五 装饰模式的应用
【实验目的】
1) 掌握装饰模式(Decorator)的特点
2) 分析具体问题,使用装饰模式进行设计。
【实验内容和要求】
“喜羊羊逃命”游戏:
喜羊羊被灰太狼追,喜羊羊最多 5 条命,灰太狼每咬
到喜羊羊一次,喜羊羊就要少一条命。
在逃的过程中喜羊羊可以吃到三种苹果,
吃“红苹果”可以给喜羊羊加上保护罩,吃“绿苹果”可以加快喜羊羊奔跑速度,
吃“黄苹果”可以使喜羊羊趟着水跑。
应用装饰模式,用 C#控制台应用程序实现
该设计。
绘制该模式的 UML 图。
提示:
这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊
羊派生 3*2*1=6 个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水
的喜羊羊,既有保护罩又会趟水的喜羊羊,奔跑速度快且会趟水的喜羊羊,有
保护罩且奔跑速度快的喜羊羊,有保护罩、奔跑速度快且会趟水的喜羊羊),如
果使用装饰模式的那就不用派生诸多子类了,当喜羊羊每吃到一个苹果,我们
就用装饰模式给喜羊羊加一个动态增加一个新功能即可。
【模式类图】
【模式代码】
public class DecoratorTest01 {
public static void main(String[] args) {
ConcreteXiYY cxyy=new ConcreteXiYY();
ProtectXiYangyang px=new ProtectXiYangyang();
FastXiYangyang fx=new FastXiYangyang();
SwimingXiYangyang sx=new SwimingXiYangyang();
px.setXiYangyang(cxyy);
px.Operation();
fx.setXiYangyang(px);
fx.Operation();
sx.setXiYangyang(fx);
sx.Operation();
}
}
interface XiYangyang{
public void Operation();
}
class ConcreteXiYY implements XiYangyang{
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("喜羊羊");
}
}
abstract class Decorator implements XiYangyang{
protected XiYangyang xyy;
public void setXiYangyang(XiYangyang xyy){
this.xyy=xyy;
}
@Override
public void Operation() {
// TODO Auto-generated method stub
xyy.Operation();
}
}
class ProtectXiYangyang extends Decorator {
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.print(" 有保护罩的");
super.Operation();
}
}
class FastXiYangyang extends Decorator {
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.print(" 加速的");
super.Operation();
}
}
class SwimingXiYangyang extends Decorator {
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.print(" 会游泳的");
super.Operation();
}
}
【运行截图】
【实验小结】
装饰模式的适用情况有:
当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时。
当需要将对象的某些职责进行撤销操作时。
当不能用生成子类的方法进行当前系统的扩充时。
实验六 代理模式的应用
【实验目的】
1) 掌握代理模式(Proxy)的特点
2) 分析具体问题,使用代理模式进行设计。
【实验内容和要求】
生产商(Factory)需要销售商品(Product),网上商城(E-Shop)提供了一个平台,
可以帮助销售这些商品,获得更大的销量。
当顾客(Custom)从网上商城选购商
品的时候,实际是从生产商获得的商品。
应用代理模式,用 C#控制台应用程序
改进该设计。
绘制该模式的 UML 图。
【模式UML图】
【实验代码】
public class ProxyTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
E_shop es=new E_shop();
es.product();
}
}
abstract class Product{
public abstract void product();
}
class Factory extends Product{
@Override
public void product() {
// TODO Auto-generated method stub
System.out.println("商品正在促销中,满一百减 50.");
}
}
class E_shop extends Product{
private Factory factory;
public E_shop(){
factory=new Factory();
}
@Override
public void product() {
// TODO Auto-generated method stub
factory.product();
}
}
【运行截图】
【实验小结】
代理模式的有以下几种适用情况:
当需要为一个对象在不同的地址空间提供局部的代表时。
当需要创建开销非常大的对象时。
当需要控制原始对象的访问时。
当需要再访问对象时执行一些附加操作时,比如通过代理对象计算访问实
际对象的次数。
实验七 观察者模式的应用
【实验目的】
1) 掌握外观模式(Observer)的特点
2) 分析具体问题,使用外观模式进行设计。
【实验内容和要求】
网上商店中如果商品(product)在名称(name)、价格(price)等方面有
变化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。
如何设
计实现?
说明你所选择的设计模式,画出类关系图并指明各个类的角色。
应用
外观模式,用 C#控制台应用程序改进该设计。
绘制该模式的 UML 图。
【模式 UML 图】
【模式代码】
import java.util.ArrayList;
public class ObeserverTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteSubject cs=new ConcreteSubject();
cs.Attach(new ConcreteObserver(cs, "1 号会员"));
cs.Attach(new ConcreteObserver(cs, "2 号会员"));
cs.Attach(new ConcreteObserver(cs, "3 号会员"));
cs.Attach(new ConcreteObserver(cs, "4 号会员"));
cs.setState("C++编程思想价钱下降 100 元");
cs.Notify();
}
}
abstract class Observer{
public abstract void update();
}
class ConcreteObserver extends Observer{
private String name;
private String state;
private ConcreteSubject cs;
public ConcreteSubject getConc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 实验 报告 范文