java模式之组合模式

组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

例如:发廊会员卡,这个发廊比较大,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。

总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用也具有一致性。

源码:

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. public class PayDemo {  
  5.   
  6.     public abstract class Deal {  
  7.         String name;  
  8.   
  9.         public abstract void add(Market m);  
  10.   
  11.         public abstract void remove(Market m);  
  12.   
  13.         public abstract void PayByCard();  
  14.     }  
  15.   
  16.     // 分店  
  17.     public class F extends Deal {  

  18.         List<Deal> list = new ArrayList<PayDemo.Deal>();  
  19.   
  20.         public F(String s) {  
  21.             this.name = s;  
  22.         }  
  23.   
  24.         @Override  
  25.         public void add(Deal m) {  
  26.             list.add(m);  
  27.         }  
  28.   
  29.         @Override  
  30.         public void remove(Deal m) {  
  31.             list.remove(m);  
  32.         }  
  33.   
  34.         @Override  
  35.         public void PayByCard() {  
  36.             System.out.println(name + "消费,积分已累加入该会员卡");  
  37.             for (Deal m : list) {  
  38.                 m.PayByCard();  
  39.             }  
  40.         }  
  41.     }  
  42.   
  43.     // 加盟店最底层  
  44.     public class M extends Deal {  
  45.         public M(String s) {  
  46.             this.name = s;  
  47.   
  48.         }  
  49.   
  50.         @Override  
  51.         public void add(Deal m) {  
  52.        
  53.         }  
  54.   
  55.         @Override  
  56.         public void remove(Deal m) {  
  57.   
  58.         }  
  59.   
  60.         @Override  
  61.         public void PayByCard() {   
  62.             System.out.println(name + "消费,积分已累加入该会员卡");  
  63.         }  
  64.     }  
  65.   
  66.     public static void main(String[] args) {  
  67.         PayDemo demo = new PayDemo();  
  68.           
  69.         F z = demo.new F("总店");  
  70.         F f = demo.new F("北京分店");  
  71.         M hm = demo.new M("北京海淀加盟店");  
  72.         M cm = demo.new M("北京昌平加盟店");  
  73.           
  74.         f.add(hm);  
  75.         f.add(cm);  
  76.         z.add(f);  
  77.         z.PayByCard();  
  78.     }  
  79. }  
输出:总店 消费,积分已累加入该会员卡 b
北京分店消费,积分已累加入该会员卡 
北京海淀加盟店消费,积分已累加入该会员卡
北京昌平加盟店消费,积分已累加入该会员卡

组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。

这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值