设计模式--适配器模式 与 组合模式练习题目
适配器模式
实例说明:
某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性。
实例结构图
实现
CarController.java:
package com.design1;
public abstract class CarController {
public void move(){
System.out.println("汽车开动");
}
public abstract void phonate();
public abstract void twinkle();
}
PoliceSound.java:
package com.design1;
public class PoliceSound {
public void alarmSound(){
System.out.println("警车响了");
}
}
PoliceLamp.java:
package com.design1;
/**
* @author devByHfj
* @description com.design1
* @create 2022-03-21 18:53
*/
public class PoliceLamp {
public void alarmLamp(){
System.out.println("警车灯响");
}
}
PoliceCarAdapter.java:
package com.design1;
public class PoliceCarAdapter extends CarController{
private PoliceSound sound;
private PoliceLamp lamp;
public PoliceCarAdapter() {
sound = new PoliceSound();
lamp = new PoliceLamp();
}
@Override
public void phonate() {
sound.alarmSound();
}
@Override
public void twinkle() {
lamp.alarmLamp();
}
}
Client.java:
package com.design1;
public class Client {
public static void main(String[] args) {
CarController p = new PoliceCarAdapter();
p.move();
p.phonate();
p.twinkle();
}
}
运行结果:
组合模式
实例说明:
假如李先生用1个红色小袋子装了2包婺源特产(单价7.9元)、1张婺源地图(单价9.9元);用1个白色小袋子装了2包韶关香菇(单价68元)和3包韶关红茶(单价180元);用1个中袋子装了前面的红色小袋子和1个景德镇瓷器(单价380元);用1个大袋子装了前面的中袋子、白色小袋子和1双李宁牌运动鞋(单价198元),现在要求编程显示李先生放在大袋子中的所以商品信息并计算要支付的总价。本实例可按安全组合模式设计。
实例结构图
实现
AbstractBox.java:
package com.design1.composemode;
public abstract class AbstractBox {
public abstract void add(AbstractBox ab);
public abstract float sum();
}
Goods.java:
package com.design1.composemode;
public class Goods extends AbstractBox {
private String goodName;
private float price;
public Goods(String goodName, float price) {
this.goodName = goodName;
this.price = price;
}
@Override
public void add(AbstractBox ab) {
}
@Override
public float sum() {
System.out.println("商品名:" + this.goodName + ",单价:" + this.price + "元");
return this.price;
}
}
Box.java:
package com.design1.composemode;
import java.util.ArrayList;
public class Box extends AbstractBox {
ArrayList<AbstractBox> arrayList = new ArrayList<>();
private String name;
float i = 0;
public Box(String name) {
this.name = name;
}
@Override
public void add(AbstractBox ab) {
arrayList.add(ab);
}
@Override
public float sum() {
for (Object o : arrayList) {
float v = ((AbstractBox) o).sum();
i += v;
}
return i;
}
}
Client.java:
package com.design1.composemode;
public class Client {
public static void main(String[] args) {
AbstractBox good1, good2, good3, good4, good5, good6, red, white, midium, big;
good1 = new Goods("婺源特产", 7.9f);
good2 = new Goods("婺源地图", 9.9f);
good3 = new Goods("韶关香菇", 68);
good4 = new Goods("韶关红茶", 180);
good5 = new Goods("景德镇瓷器", 380);
good6 = new Goods("李宁牌运动鞋", 198);
red = new Box("红色小袋子");
white = new Box("白色小袋子");
midium = new Box("中袋子");
big = new Box("大袋子");
red.add(good1);
red.add(good1);
red.add(good2);
white.add(good3);
white.add(good3);
for(int i = 0;i<=2;i++){
white.add(good4);
}
midium.add(red);
midium.add(good5);
big.add(midium);
big.add(white);
big.add(good6);
System.out.println("袋子里面装的是:");
float sum = big.sum();
System.out.println("总价:\t"+sum);
}
}