08适配器和组合模式代码实现
适配器模式代码实现
使用适配器模式设计玩具汽车控制软件。
实例说明:某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性。
- 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个红色小袋子装了2包婺源特产(单价7.9元)、1张婺源地图(单价9.9元);用1个白色小袋子装了2包韶关香菇(单价68元)和3包韶关红茶(单价180元);用1个中袋子装了前面的红色小袋子和1个景德镇瓷器(单价380元);用1个大袋子装了前面的中袋子、白色小袋子和1双李宁牌运动鞋(单价198元),现在要求编程显示李先生放在大袋子中的所以商品信息并计算要支付的总价。本实例可按安全组合模式设计。
- 类图:
- 源代码:
- 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();
}
}
- 运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律