组合模式
组合模式的作用:由于容器对象与叶子对象在功能上有所区别,在使用这些对象的客户端代码中必须有区别的对待容器对象与叶子对象,然而我们在使用它们的时候,希望一致的处理他们,因为对这些对象的区别对待会使程序变得非常复杂。 组合模式描述了如何将容器对象和叶子对象进行递归组合,让我们在使用它们时,不需要进行区别对待,可以一致的对待容器对象和叶子对象。
结合下面的例子,可以很好的理解组合模式。
import java.util.ArrayList; import java.util.List; public class PayDemo { public abstract class Market { String name; public abstract void add(Market m); public abstract void remove(Market m); public abstract void PayByCard(); } // 分店 下面可以有加盟店 public class MarketBranch extends Market { // 加盟店列表 List<Market> list = new ArrayList<PayDemo.Market>(); //关键 public MarketBranch(String s) { this.name = s; } @Override public void add(Market m) { // TODO Auto-generated method stub list.add(m); } @Override public void remove(Market m) { // TODO Auto-generated method stub list.remove(m); } // 消费之后,该分店下的加盟店自动累加积分 @Override public void PayByCard() { System.out.println(name + "消费,积分已累加入该会员卡"); for (Market m : list) { m.PayByCard(); } } } // 加盟店 下面不在有分店和加盟店,最底层 public class MarketJoin extends Market { public MarketJoin(String s) { this.name = s; } @Override public void add(Market m) { // TODO Auto-generated method stub } @Override public void remove(Market m) { // TODO Auto-generated method stub } @Override public void PayByCard() { // TODO Auto-generated method stub System.out.println(name + "消费,积分已累加入该会员卡"); } } public static void main(String[] args) { PayDemo demo = new PayDemo(); MarketBranch rootBranch = demo.new MarketBranch("总店"); MarketBranch qhdBranch = demo.new MarketBranch("秦皇岛分店"); MarketJoin hgqJoin = demo.new MarketJoin("秦皇岛分店一海港区加盟店"); MarketJoin btlJoin = demo.new MarketJoin("秦皇岛分店二白塔岭加盟店"); qhdBranch.add(hgqJoin); //分店添加加盟店 qhdBranch.add(btlJoin); rootBranch.add(qhdBranch); //总店添加分店 /* List< Market> list1 = rootBranch.list; for (Market market : list1) { System.out.println(market); }*/ rootBranch.PayByCard(); } }