组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
例如:发廊会员卡,这个发廊比较大,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。
总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用也具有一致性。
源码:
- import java.util.ArrayList;
- import java.util.List;
- public class PayDemo {
- public abstract class Deal {
- String name;
- public abstract void add(Market m);
- public abstract void remove(Market m);
- public abstract void PayByCard();
- }
- // 分店
- public class F extends Deal {
-
- List<Deal> list = new ArrayList<PayDemo.Deal>();
- public F(String s) {
- this.name = s;
- }
- @Override
- public void add(Deal m) {
- list.add(m);
- }
- @Override
- public void remove(Deal m) {
- list.remove(m);
- }
- @Override
- public void PayByCard() {
- System.out.println(name + "消费,积分已累加入该会员卡");
- for (Deal m : list) {
- m.PayByCard();
- }
- }
- }
- // 加盟店最底层
- public class M extends Deal {
- public M(String s) {
- this.name = s;
- }
- @Override
- public void add(Deal m) {
- }
- @Override
- public void remove(Deal m) {
- }
- @Override
- public void PayByCard() {
- System.out.println(name + "消费,积分已累加入该会员卡");
- }
- }
- public static void main(String[] args) {
- PayDemo demo = new PayDemo();
- F z = demo.new F("总店");
- F f = demo.new F("北京分店");
- M hm = demo.new M("北京海淀加盟店");
- M cm = demo.new M("北京昌平加盟店");
- f.add(hm);
- f.add(cm);
- z.add(f);
- z.PayByCard();
- }
- }
输出:总店
消费,积分已累加入该会员卡
b
北京分店消费,积分已累加入该会员卡
北京海淀加盟店消费,积分已累加入该会员卡
北京昌平加盟店消费,积分已累加入该会员卡
组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。
这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。