标签:
典型例子: 管道过滤器。
下面是一个例子,不贴合实际,但是用到了 合成模式。
1 public interface SalaryComputer { 2 public int computer(int m, int n); 3 }
1 public class Add implements SalaryComputer { 2 @Override 3 public int computer(int m, int n) { 4 System.out.println(m + "+" + n); 5 return m + n; 6 } 7 }
1 public class Sub implements SalaryComputer { 2 @Override 3 public int computer(int m, int n) { 4 System.out.println(m+"-"+n); 5 return m-n; 6 } 7 }
1 public class Composite implements SalaryComputer { 2 private List<SalaryComputer> list; 3 4 public Composite() { 5 list = new ArrayList<SalaryComputer>(); 6 } 7 8 public void add(SalaryComputer salaryComputer) { 9 list.add(salaryComputer); 10 } 11 12 public void remove(SalaryComputer salaryComputer) { 13 list.remove(salaryComputer); 14 } 15 16 @Override 17 public int computer(int m, int n) { 18 int count = 0; 19 for (int i = 0; i < list.size(); i++) { 20 SalaryComputer salaryComputer = list.get(i); 21 count += salaryComputer.computer(m, n); 22 System.out.println(count); 23 24 } 25 System.out.println(count); 26 27 return count; 28 } 29 30 }
1 public class Client { 2 3 public static void main(String[] args) { 4 5 Composite salaryComputer = new Composite(); 6 salaryComputer.add(new Add()); 7 salaryComputer.add(new Sub()); 8 salaryComputer.computer(1000, 2); 9 10 } 11 12 }
补充:
定义接口 interface A
定义类 class B implements A
Client:
A a = new B();
如果 A,和 B 中有同名 成员变量(值不同) , 此时 a 中 实际有 两个 同名 的 成员变量。 a.成员变量 实际调用的 是继承 的值,a.方法 调用的 是 B 中的方法。
抽象类类似。
这是Client.java 中 不用 SalaryComputer salaryComputer = new Compoiste() ; 的原因。
标签:
原文地址:http://www.cnblogs.com/ChuangZhang/p/5361686.html