08适配器和组合模式代码实现

发布时间 2023-04-24 21:19:43作者: vbig

适配器模式代码实现

使用适配器模式设计玩具汽车控制软件。

实例说明:某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性。

  1. 类图:
    Pasted image 20230322091530

  2. 源代码:

  • CarController
package com.fish.pattern.adapter;  
  
public abstract class CarController {  
    public void move(){  
        System.out.println("警车移动!");  
    }  
    public abstract void phonate();  
    public abstract void twinkle();  
}
  • PoliceLamp
package com.fish.pattern.adapter;  
  
public class PoliceLamp {  
    public void alarmLamp(){  
        System.out.println("警灯闪烁!");  
    }  
}
  • PoliceSound
public class PoliceSound {  
    public void alarmSound(){  
        System.out.println("警笛长鸣!");  
    }  
}
  • PoliceCatAdapter
package com.fish.pattern.adapter;  
  
public class PoliceCarAdapter extends CarController{  
    PoliceSound ps;  
    PoliceLamp pl;  
  
    public PoliceCarAdapter() {  
  
        ps = new PoliceSound();  
        pl = new PoliceLamp();  
  
    }  
  
    @Override  
    public void phonate() {  
        pl.alarmLamp();  
    }  
  
    @Override  
    public void twinkle() {  
        ps.alarmSound();  
    }  
}
  • Client
package com.fish.pattern.adapter;  
  
//对象适配器模式  
/*CarController类充当抽象目标  
 * PoliceSound和PoliceLamp类充当适配者  
 * PoliceCarAdapter 充当适配器  
 */
public class Client {  
    public static void main(String[] args) {  
        PoliceCarAdapter pca = new PoliceCarAdapter();  
        pca.move();  
        pca.phonate();  
        pca.twinkle();  
    }  
}
  1. 运行结果:

Pasted image 20230322092822

组合模式代码实现

用组合模式实现当用户在商店购物后,显示其所选商品信息,并计算所选商品总价的功能。

实例说明:假如李先生用1个红色小袋子装了2包婺源特产(单价7.9元)、1张婺源地图(单价9.9元);用1个白色小袋子装了2包韶关香菇(单价68元)和3包韶关红茶(单价180元);用1个中袋子装了前面的红色小袋子和1个景德镇瓷器(单价380元);用1个大袋子装了前面的中袋子、白色小袋子和1双李宁牌运动鞋(单价198元),现在要求编程显示李先生放在大袋子中的所以商品信息并计算要支付的总价。本实例可按安全组合模式设计。

  1. 类图:

Pasted image 20230322093921

  1. 源代码:
  • Articles
package com.fish.pattern.composite;  
  
//抽象构件:物品  
public interface Articles {  
    float calculation(); //计算  
    void show();  
}
  • Bags
package com.fish.pattern.composite;  
  
import java.util.ArrayList;  
  
//树枝构件:袋子  
public class Bags implements Articles {  
    private String name;     //名字  
    private ArrayList<Articles> bags = new ArrayList<Articles>();  
    public Bags(String name) {  
        this.name = name;  
    }  
    public void add(Articles c)  
    {  
        bags.add(c);  
    }  
    public void remove(Articles c)  
    {  
        bags.remove(c);  
    }  
    public Articles getChild(int i)  
    {  
        return bags.get(i);  
    }  
  
    @Override  
    public float calculation() {  
        float s = 0;  
        for(Object obj:bags) {  
            s+=((Articles)obj).calculation();  
        }  
        return s;  
    }  
  
    @Override  
    public void show(){  
        for(Object obj:bags) {  
            ((Articles)obj).show();  
        }  
    }  
}
  • Goods
package com.fish.pattern.composite;  
  
//树叶构件:商品  
public class Goods implements Articles {  
    private String name;     //名字  
    private int quantity;    //数量  
    private float unitPrice; //单价  
    public Goods(String name,int quantity,float unitPrice) {  
        this.name = name;  
        this.quantity=quantity;  
        this.unitPrice=unitPrice;  
    }  
    @Override  
    public float calculation() {  
        return quantity*unitPrice;  
    }  
    @Override  
    public void show(){  
        System.out.println(name+"(数量:"+quantity+",单价:"+unitPrice+"元"+",小计:"+calculation()+"元)");  
    }  
}
  • ShoppingTest
package com.fish.pattern.composite;  
  
public class ShoppingTest {  
    public static void main(String[] args) {  
        float sum = 0;  
        Bags bigBag,mediumBag,smallRedBag,smallWhiteBag;  
        Goods sp;  
        bigBag=new Bags("大袋子");  
        mediumBag=new Bags("中袋子");  
        smallRedBag=new Bags("红色小袋子");  
        smallWhiteBag=new Bags("白色小袋子");  
        sp=new Goods("婺源特产",2,7.9f);  
        smallRedBag.add(sp);  
        sp=new Goods("婺源地图",1,9.9f);  
        smallRedBag.add(sp);  
        sp=new Goods("韶关香菇",2,68);  
        smallWhiteBag.add(sp);  
        sp=new Goods("韶关红茶",3,180);  
        smallWhiteBag.add(sp);  
        sp=new Goods("景德镇瓷器",1,380);  
        mediumBag.add(sp);  
        mediumBag.add(smallRedBag);  
        sp=new Goods("李宁牌运动鞋",1,198);  
        bigBag.add(sp);  
        bigBag.add(mediumBag);  
        bigBag.add(smallWhiteBag);  
        System.out.println("您选购的商品有:");  
        bigBag.show();  
        sum=bigBag.calculation();  
        System.out.println("要支付的总价是:"+sum+"元");  
  
  
        bigBag.getChild(1).show();  
        bigBag.getChild(2).show();  
  
    }  
}
  1. 运行结果:

Pasted image 20230322094600