今天我们来谈谈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);
}
}