组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。
根据图片的意思,我便结合自己的理解,写了个demo,有什么不对的地方,请大家留意,指点下。
以下是图片来自网络
demo:功能如下: 理解的有问题请指出。
动物作为一个基类,人、猪,都继承了他的所有属性,并且有自己独特的属性以及方法。(相当于Button\textview这些叶子节点)
他们有一个共同的房间,房间里门,对他们的进出进行了实时的管理操作。(相当于ViewGroup统一管理布局)
Animal.java
package com.ferris.composite;
/**
* ferris
* @author 459821731@qq.com
* 动物类
*/
public class Animal {
public class Attribute{
public static final int PEOPLE=0;//人类
public static final int COW=1;//牛
public static final int SLEEP=2;//羊
public static final int PIG=3;//猪
}
public Animal(){
}
protected int id; //动物的 特殊id
protected String name;//动物的名字
protected int type;//动物的类型
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
//动物的行为方法
protected void operation(){}
}
package com.ferris.composite;
public class PersonAnimal extends Animal {
private String zoulu;
public String getZoulu() {
return zoulu;
}
public void setZoulu(String zoulu) {
this.zoulu = zoulu;
}
public PersonAnimal() {
// TODO Auto-generated constructor stub
}
}
package com.ferris.composite;
public class PigAnimal extends Animal {
private String zhurou;//独特的属性,可以被吃
public String getZhurou() {
return zhurou;
}
public void setZhurou(String zhurou) {
this.zhurou = zhurou;
}
public PigAnimal() {
// TODO Auto-generated constructor stub
}
}
package com.ferris.composite;
import java.util.ArrayList;
/**
* 这是一个门,管理这进出
* @author Administrator
*
*/
public interface Door {
public void addAnimal(Animal animal);//添加一个动物
public void removeAnimal(Animal animal);//移除一个动物
public void removeAllAnimal();//移除所有动物
public int getAnimalCount();//获取所以动物数量
public ArrayList<Animal> getAnimals();
}
House.java 房间,实现了一个接口 door
package com.ferris.composite;
import java.util.ArrayList;
/**
* 房间 ,门管理着所以动物的进出
* @author Administrator
*
*/
public class House implements Door{
private ArrayList<Animal> animals=new ArrayList<Animal>();
private static House house;
public static House getHouseInstance(){
if(house==null){
synchronized (House.class) {
if(house==null){
return new House();
}
}
}
return house;
}
@Override
public void addAnimal(Animal animal) {
// TODO Auto-generated method stub
if(!animals.contains(animal)){
animals.add(animal);
}
}
@Override
public void removeAnimal(Animal animal) {
// TODO Auto-generated method stub
if(animals.contains(animal)){
animals.remove(animal);
}
}
@Override
public void removeAllAnimal() {
// TODO Auto-generated method stub
if(animals.size()>0){
animals.clear();
}
}
@Override
public int getAnimalCount() {
// TODO Auto-generated method stub
return animals==null?0:animals.size();
}
@Override
public ArrayList<Animal> getAnimals() {
// TODO Auto-generated method stub
return animals;
}
}
package com.ferris.androidpattern;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
import com.ferris.composite.Animal.Attribute;
import com.ferris.composite.House;
import com.ferris.composite.PersonAnimal;
import com.ferris.composite.PigAnimal;
public class MainActivity extends FragmentActivity {
private House house;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
house=House.getHouseInstance();//得到一个房间
//人进入房间了
PersonAnimal json=new PersonAnimal();
json.setId(1);
json.setName("我是人");
json.setType(Attribute.PEOPLE);
house.addAnimal(json);//一个人进入房间了
PigAnimal pig=new PigAnimal();
pig.setId(2);
pig.setName("我是猪");
pig.setType(Attribute.PIG);
house.addAnimal(pig);//猪也进入房间了
Toast.makeText(MainActivity.this, "房间里有多少动物:"+house.getAnimalCount(), 1).show();
}
}
原文:http://blog.csdn.net/xufeifandj/article/details/41479043