装饰,外观模式

实验目的与任务

目的:熟悉UML的使用,熟悉装饰、外观模式。

任务:按照实验内容要求,完成使用装饰、外观模式实现实验内容。

预习内容

复习课程的内容,熟悉装饰、外观模式的使用。

实验内容及要求

  • 装饰模式:

1、食堂面店价格计算如下:面5元,加鸡蛋2元,加大排5元,加鱼排5元,请结合装饰模式,给出类图并实现。

  • 外观模式:

2、有如下场景:电脑的启动过程为:cpu、内存、硬盘,关闭过程相反,请结合外观模式给出类图并实现。

 

实验结果(可续页)

Component.java:

public interface Component {

    public String desc();

    public int price();

    public void show();

}

Noodle.java

public class Noodle implements Component {

 

    @Override

    public String desc() {

       // TODO Auto-generated method stub

       return "Noodle";

    }

    @Override

    public int price() {

       // TODO Auto-generated method stub

       return 5;

    }

    @Override

    public void show() {

       // TODO Auto-generated method stub

       System.out.println("您点的是:"+this.desc()+"价格"+this.price());

    }

}

Decorator.java:

public abstract class Decorator implements Component{

    public Component c;

    public Decorator(Component c){

       this.c=c;

    }

}

EggDecorator.java:

public class EggDecorator extends Decorator{

 

    public EggDecorator(Component c) {

       super(c);

       // TODO Auto-generated constructor stub

    }

    @Override

    public String desc() {

       // TODO Auto-generated method stub

       return c.desc()+",eggs";

    }

    @Override

    public int price() {

       // TODO Auto-generated method stub

       return c.price()+2;

    }

    @Override

    public void show() {

       // TODO Auto-generated method stub

       System.out.println("您点的是:"+this.desc()+"价格"+this.price());

    }

}

ChopDecorator.java:

public class ChopDecorator extends Decorator{

    public ChopDecorator(Component c) {

       super(c);

       // TODO Auto-generated constructor stub

    }

    @Override

    public String desc() {

       // TODO Auto-generated method stub

       return c.desc()+",chop";

    }

    @Override

    public int price() {

       // TODO Auto-generated method stub

       return c.price()+5;

    }

    @Override

    public void show() {

       // TODO Auto-generated method stub

       System.out.println("您点的是:"+this.desc()+"价格"+this.price());

    }

}

FishchopDecorator.java:

public class FishchopDecorator extends Decorator{

 

    public FishchopDecorator(Component c) {

       super(c);

       // TODO Auto-generated constructor stub

    }

    @Override

    public String desc() {

       // TODO Auto-generated method stub

       return c.desc()+",fishchop";

    }

    @Override

    public int price() {

       // TODO Auto-generated method stub

       return c.price()+5;

    }

    @Override

    public void show() {

       // TODO Auto-generated method stub

       System.out.println("您点的是:"+this.desc()+"价格"+this.price());

    }

}

Main.java:

public class Main {

    public static void main(String[] args){

       //单点面

       Noodle noodle=new Noodle();

       noodle.show();

       //加鸡蛋

       EggDecorator eggDecorator=new EggDecorator(noodle);

       eggDecorator.show();

       //加大排

       ChopDecorator chopDecorator=new ChopDecorator(noodle);

       chopDecorator.show();

       //加鸡蛋加鱼排

       FishchopDecorator fishchopDecorator=new FishchopDecorator(eggDecorator);

       fishchopDecorator.show();

    }

}

结果:

类图:

2

子系统的角色

Cpu.java

 

Memory.java

 

HardDisk.java

 

 

门面Facade.java

类图:

思考题:

  1. 购物清单一般由购物人、购物清单、购物总额组成,请结合装饰模式,给出设计的类图?

 

2、门面模式是否符合开闭原则,请举例说明?

不符合开闭原则

当系统内部需要增加新的内容时,门面为了能够应用上相应的改变,在门面中也需要添加对其的调用。

比如家里的电器,空调,冰箱,烤炉,电脑等,需要用一个总电闸来控制开关,而如果家里新添加了一个电器,就要对总电闸里面的调用进行修改

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/yszbrzdd/article/details/93521588