java23中设计模式之组合模式

 1. 代码演示(1)

package com.bjsxt.composite;

/**
 * 抽象组件
 * @author Administrator
 *
 */
public interface Component {
    void operation();
}

//叶子组件
interface Leaf extends Component {
}
//容器组件
interface Composite extends Component {
    void add(Component c);
    void remove(Component c);
    Component getChild(int index);
}
component 抽象组件
package com.bjsxt.composite;

import java.util.ArrayList;
import java.util.List;

//抽象构建
public interface AbstractFile {
    void killVirus();  //杀毒
}


class ImageFile implements AbstractFile {
    private String name;
    
    public ImageFile(String name) {
        super();
        this.name = name;
    }

    @Override
    public void killVirus() {
        System.out.println("---图像文件:"+name+",进行查杀!");
    }
    
}
class TextFile implements AbstractFile {
    private String name;
    
    public TextFile(String name) {
        super();
        this.name = name;
    }
    
    @Override
    public void killVirus() {
        System.out.println("---文本文件:"+name+",进行查杀!");
    }
}
class VideoFile implements AbstractFile {
    private String name;
    
    public VideoFile(String name) {
        super();
        this.name = name;
    }
    
    @Override
    public void killVirus() {
        System.out.println("---视频文件:"+name+",进行查杀!");
    }
}

class Folder implements AbstractFile {
    private String name;
    //定义容器,用来存放本容器构建下的子节点
    private List<AbstractFile> list = new ArrayList<AbstractFile>();
    
    public Folder(String name) {
        super();
        this.name = name;
    }

    public void add(AbstractFile file){
        list.add(file);
    }
    public void remove(AbstractFile file){
        list.remove(file);
    }
    public AbstractFile getChild(int index){
        return list.get(index);
    }

    @Override
    public void killVirus() {
        System.out.println("---文件夹:"+name+",进行查杀");
        
        for (AbstractFile file : list) {
            file.killVirus();
        }
        
    }
    
}
AbstractFile  例子
package com.bjsxt.composite;

public class Client {
    public static void main(String[] args) {
        AbstractFile f2,f3,f4,f5;
        Folder f1 = new Folder("我的收藏");
        
        f2 = new ImageFile("老高的大头像.jpg");
        f3 = new TextFile("Hello.txt");
        f1.add(f2);
        f1.add(f3);
        
        Folder f11 = new Folder("电影");
        f4 = new VideoFile("笑傲江湖.avi");
        f5 = new VideoFile("神雕侠侣.avi");
        f11.add(f4);
        f11.add(f5);
        f1.add(f11);
        
        
//        f2.killVirus();
        
        f1.killVirus();
        
        
    }
}
Client 测试类

  2 代码演示(2)

package com.atguigu.composite;

public abstract class OrganizationComponent {

    private String name; // 名字
    private String des; // 说明
    
    protected  void add(OrganizationComponent organizationComponent) {
        //默认实现
        throw new UnsupportedOperationException();
    }
    
    protected  void remove(OrganizationComponent organizationComponent) {
        //默认实现
        throw new UnsupportedOperationException();
    }

    //构造器
    public OrganizationComponent(String name, String des) {
        super();
        this.name = name;
        this.des = des;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }
    
    //方法print, 做成抽象的, 子类都需要实现
    protected abstract void print();
    
    
}
OrganizationComponent
package com.atguigu.composite;

import java.util.ArrayList;
import java.util.List;

//University 就是 Composite , 可以管理College
public class University extends OrganizationComponent {

    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

    // 构造器
    public University(String name, String des) {
        super(name, des);
        // TODO Auto-generated constructor stub
    }

    // 重写add
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        // TODO Auto-generated method stub
        organizationComponents.add(organizationComponent);
    }

    // 重写remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        // TODO Auto-generated method stub
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return super.getName();
    }

    @Override
    public String getDes() {
        // TODO Auto-generated method stub
        return super.getDes();
    }

    // print方法,就是输出University 包含的学院
    @Override
    protected void print() {
        // TODO Auto-generated method stub
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents 
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

}
University
package com.atguigu.composite;

import java.util.ArrayList;
import java.util.List;

public class College extends OrganizationComponent {

    //List 中 存放的Department
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

    // 构造器
    public College(String name, String des) {
        super(name, des);
        // TODO Auto-generated constructor stub
    }

    // 重写add
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        // TODO Auto-generated method stub
        //  将来实际业务中,Colleage 的 add 和  University add 不一定完全一样
        organizationComponents.add(organizationComponent);
    }

    // 重写remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        // TODO Auto-generated method stub
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return super.getName();
    }

    @Override
    public String getDes() {
        // TODO Auto-generated method stub
        return super.getDes();
    }

    // print方法,就是输出University 包含的学院
    @Override
    protected void print() {
        // TODO Auto-generated method stub
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents 
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }


}
College
package com.atguigu.composite;

public class Department extends OrganizationComponent {

    //没有集合
    
    public Department(String name, String des) {
        super(name, des);
        // TODO Auto-generated constructor stub
    }

    
    //add , remove 就不用写了,因为他是叶子节点
    
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return super.getName();
    }
    
    @Override
    public String getDes() {
        // TODO Auto-generated method stub
        return super.getDes();
    }
    
    @Override
    protected void print() {
        // TODO Auto-generated method stub
        System.out.println(getName());
    }

}
Department
package com.atguigu.composite;

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //从大到小创建对象 学校
        OrganizationComponent university = new University("清华大学", " 中国顶级大学 ");
        
        //创建 学院
        OrganizationComponent computerCollege = new College("计算机学院", " 计算机学院 ");
        OrganizationComponent infoEngineercollege = new College("信息工程学院", " 信息工程学院 ");
        
        
        //创建各个学院下面的系(专业)
        computerCollege.add(new Department("软件工程", " 软件工程不错 "));
        computerCollege.add(new Department("网络工程", " 网络工程不错 "));
        computerCollege.add(new Department("计算机科学与技术", " 计算机科学与技术是老牌的专业 "));
        
        //
        infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 "));
        infoEngineercollege.add(new Department("信息工程", " 信息工程好学 "));
        
        //将学院加入到 学校
        university.add(computerCollege);
        university.add(infoEngineercollege);
        
        university.print();
        //infoEngineercollege.print();
    }

}
Client

 

posted @ 2017-07-23 10:12  周无极  阅读(274)  评论(0编辑  收藏  举报