今天我们来谈谈android的设计模式的Composite吧,里面的例子用的是高焕堂老师的一些资料,加上自己对android的一些理解,先说说具体的本文的代码的框架的结构吧,首先有一个叫Money的类作为类似android的View,然后继承自Money的Wallet作为android中的ViewGroup,这个Wallet可以包含自己,也可以包含money,接下来就是和Wallet同类的继承于Money的Coin,这个类只能包含本身,第三次也就是我们最爱用的一层,继承自Wallet的myWallet,这个的作用就和Linearlayout的作用差不多,也就是可以包含,还有就是Coin的具体five,ten,还有就是vm类似于android中的activity,而machine类似mainactivity,大概逻辑就是这样,大家对比看一下,总之在这里主要的思想就是,钱包里面可以包含钱,也可以包含钱包,而钱里面就只能有钱,用高老师经典的话语就是乱中有序,序中有乱。我认为的就是世界是一个整体,表面上是乱的,如果分了类以后就变成了有序的,但是每个类别的里面又是乱的,具体的东西大家就自己去理解一下吧!贴代码了:
package com.jk.compositedemo; public abstract class Coin extends Money { //just as the TextView in the android @Override public double onValue() { return 0; } @Override public final void add (Money money) { } }
package com.jk.compositedemo; public class FiveDollar extends Coin { //just as the Button in the android @Override public double onValue() { // TODO Auto-generated method stub return 5.0; } }
package com.jk.compositedemo; public class Machine extends VM { //just as the MainActivity in android @Override public void factoryMethod() { Wallet wa=new MyWallet(); Wallet wa2=new MyWallet(); wa2.add(new TenDollar()); feedMoney(wa2); wa.add(wa2); wa.add(new FiveDollar()); feedMoney(wa); } public void showAmount(){ System.out.println("AMT:"+getAmount()); } }
package com.jk.compositedemo; public abstract class Money { //just as the View in the android //calculate the total money public abstract double onValue(); //add the money public abstract void add(Money money); }
package com.jk.compositedemo; public class MyWallet extends Wallet { //just as the LinearLayout in the android @Override public double onValue() { // TODO Auto-generated method stub return super.onValue()*1.05; } }
package com.jk.compositedemo; public class TenDollar extends Coin { //just as the another subclass of the TextView @Override public double onValue() { return 10.0; } }
package com.jk.compositedemo; public class Test { /** * @author jk */ public static void main(String[] args) { // TODO Auto-generated method stub Machine machine=new Machine(); machine.factoryMethod(); machine.showAmount(); } }
package com.jk.compositedemo; public abstract class VM { //just as the activity private Money money; public void feedMoney(Money money){ this.money=money; } public double getAmount() { return money.onValue(); } public abstract void factoryMethod(); }
package com.jk.compositedemo; import java.util.ArrayList; public class Wallet extends Money { protected ArrayList<Money> coll; //just as the View in the android public Wallet() { coll=new ArrayList<Money>(); } public double onValue() { double sum=0; for(int i=0;i<coll.size();i++){ sum+=((Money)coll.get(i)).onValue(); } return sum; } public void add(Money money) { coll.add(money); } }