组合模式(Composite):“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
他的例子很多,比如我们的文件系统,每一个文件夹可以复制,可以删除,每一个文件也可以复制和删除
再比如我们现实中的电脑
电脑的机箱里可以装上硬盘和主板,还有电源,而主板上还有内存卡等 这里面的所有部件都可以换掉,有些部件甚至可以用2个或三个。比如硬盘和内存,网卡等
这里我就模拟这个电脑,用java来实现
第一步:创建它们的共有接口 Composite
public abstract class Computer {
private String name;
public Computer(String name){
this.name = name;
}
public abstract double Price();
public boolean add(Computer computer){
return false;
}
public Iterator iter() {
return null;
}
}
以上代码,我们定义了一个抽象类,并且有一个抽象方法,抽象方法是获得这个部件的价格,比如主板,比如内存,比如主板和内存
还定义了一个添加部件的普通方法
还定义了一个用于遍历的iter方法
第二步:定义每一个部件的行为(Computerposite),比如在机箱上添加(add)一个硬盘,在主板上添加一个内存,他的作用就是实现与子部件相关的操作,当然它肯定是需要继承或实现Composite的
public abstract class Computerposite extends Computer{
private List<Computer> equipment = new ArrayList<Computer>();
private int i = 0;
public Computerposite(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public double Price() {
double nprice = 0;
Iterator iter = equipment.iterator();
while(iter.hasNext()){
Computer computer = (Computer) iter.next();
if(computer instanceof Memory){
System.out.println("在主板上发现一个内存,价格:"+Memory.price);
}else if(computer instanceof Board){
System.out.println("在机箱里发现一个主板,价格:"+Board.price);
}
nprice += computer.Price();
}
return nprice;
}
public boolean add(Computer computer){
if(computer instanceof Board && this instanceof Chassis){
System.out.println("在机箱上添加一个主板");
}else if(computer instanceof Memory && this instanceof Board){
System.out.println("在主板上添加一个内存");
}
return equipment.add(computer);
}
public Iterator<Computer> iter() {
return equipment.iterator();
}
// 重载Iterator方法
public boolean hasNext() {
return i < equipment.size();
}
// 重载Iterator方法
public Object next() {
if (hasNext())
return equipment.get(i++);
else
throw new NoSuchElementException();
}
}
简要说明以上代码:
A:list数组中保存的是每一个部件哦
B:price方法,就是遍历当前的对象里的list,比如当前对象如果是主板,它就会得到主板里面的部件的价格,比如主板上有内存,他就得到内存的价格
C:add方法,里面的if语句主要是用于限制,本例几乎没做限制,因为我将添加到list的add语句写在了最后。比如,你的内存条不能安装在机箱上吧,所以这里是用于限定的,不能随便添加的
this表示当前的对象,而computer表示待添加的对象
D:其它方法就是重写了
最后一步,列出各个部件,用于调用
主板(Board)
public class Board extends Computerposite{
public Board(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public static double price = 80;
@Override
public double Price() {
// TODO 自动生成的方法存根
return price+super.Price();
}
}
机箱(chassis)
public class Chassis extends Computerposite{
public Chassis(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public static double price = 50;
@Override
public double Price() {
// TODO Auto-generated method stub
return price+super.Price();
}
}
内存(Memory)
public class Memory extends Computerposite{
public Memory(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public static double price = 100;
@Override
public double Price() {
// TODO Auto-generated method stub
return price+super.Price();
}
}
接下来,我们创建一个客户端测试下吧
public class demo {
public static void main(String[] args) {
Chassis chassis = new Chassis("机箱");
Board board = new Board("主板");
board.add(new Memory("内存"));
chassis.add(board);
System.out.println("价格是:"+chassis.Price());
}
}
结果如下:
在主板上找到一个内存
在机箱上找到一个主板
在机箱里发现一个主板,价格:80.0
在主板上发现一个内存,价格:100.0
价格是:230.0
这个例子不是很好的,因为如果我们再新增一个硬盘,除了新增硬盘类,还需要修改Computerposite的add方法,因为硬盘总不能放在内存上吧,是不是。当然,电脑也就那么几样部件,您也可以全部写完哦
有时间的话,我再写个文件系统的组合模式吧,因为它就只有两种,文件和文件夹。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情