设计模式-7种结构型

1.桥接模式

测试环境类:消息通知系统

public class TestClient {

    /**
     * 发送提示消息
     * <p>
     * 从业务上看,消息又分成普通消息、加急消息和特急消息多种
     * 加急消息:是在消息上添加加急,
     * 特急消息:除了添加特急外,还会做一条催促的记录,多久不完成会继续催促;
     * <p>
     * 从发送消息的手段上看,又有系统内短消息、手机短信息、邮件等。
     */
    @Test
    public void test() {
        //创建具体的消息发送器
        ISender sender = new SmsSender();

        //创建普通消息
        AbsMessage message = new CommonMessage(sender);
        message.send("加班申请速批", "李总");

        //将实现方式切换成邮件,再次发送
        sender = new EmailSender();

        //创建加急消息
        message = new UrgencyMessage(sender);
        message.send("加班申请速批", "李总");

        //输出结果:
        //使用系统内短消息的方法,发送消息'加班申请速批'给李总
        //使用邮件消息的方法,发送消息'加急:加班申请速批'给李总
    }
}

抽象消息类:

public abstract class AbsMessage {

    private ISender ISender;

    public AbsMessage(ISender ISender) {
        this.ISender = ISender;
    }

    public void send(String msg, String toUser) {
        this.ISender.send(msg, toUser);
    }
}

消息发送接口:

public interface ISender {

    void send(String msg, String toUser);
}

具体消息类:

/**
 * 加急消息类
 * <p>
 * 作者:余天然 on 16/9/13 上午1:16
 */
public class UrgencyMessage extends AbsMessage {

    public UrgencyMessage(ISender ISender) {
        super(ISender);
    }

    @Override
    public void send(String msg, String toUser) {
        msg = "加急:" + msg;
        super.send(msg, toUser);
    }

    /**
     * 监控消息的处理状态
     *
     * @param messageId 消息id
     * @return 处理状态
     */
    public Object watch(String messageId) {
        return null;
    }

}

具体消息发送者:

/**
 * 系统内短消息发送器
 * <p>
 * 作者:余天然 on 16/9/13 上午1:19
 */
public class SmsSender implements ISender {
    @Override
    public void send(String msg, String toUser) {
        System.out.println("使用系统内短消息的方法,发送消息'" + msg + "'给" + toUser);
    }
}

2.组合模式

测试场景类:文件系统

public class TestClient {

    @Test
    public void test() {
        /**
         * 我们先建立一个这样的文件系统:
         *                  总文件夹
         *
         *   a.txt    b.jpg                   c文件夹
         *                      c_1.text  c_1.rmvb    c_1.jpg
         *
         */
        //构造总文件夹
        Folder rootFolder = new Folder("总文件夹");
        TextFile aText = new TextFile("a.txt");
        ImageFile bImage = new ImageFile("b.jpg");
        Folder cFolder = new Folder("c文件夹");
        rootFolder.add(aText);
        rootFolder.add(bImage);
        rootFolder.add(cFolder);

        //构造c文件夹
        TextFile cText = new TextFile("c_1.text");
        VideoFile cVideo = new VideoFile("c_1.rmvb");
        ImageFile cImage = new ImageFile("c_1.jpg");
        cFolder.add(cText);
        cFolder.add(cVideo);
        cFolder.add(cImage);

        //遍历c文件夹
        cFolder.display();

        System.out.println("-----------------------");

        //将c_1.txt删除,再遍历根文件夹
        cFolder.remove(cText);
        rootFolder.display();

        //输出结果:
        //这是文本文件,文件名:c_1.text
        //这是视频文件,文件名:c_1.rmvb
        //这是图片文件,文件名:c_1.jpg
        //-----------------------
        //这是文本文件,文件名:a.txt
        //这是图片文件,文件名:b.jpg
        //这是视频文件,文件名:c_1.rmvb
        //这是图片文件,文件名:c_1.jpg
    }
}

抽象文件类:

public abstract class AbsFile {

    private String name;

    public AbsFile(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public abstract void display();
}

文件夹类:

public class Folder extends AbsFile {

    private List<AbsFile> files;

    public Folder(String name) {
        super(name);
        files=new ArrayList<>();
    }

    /**
     * 浏览文件夹中的文件
     */
    @Override
    public void display() {
        for (AbsFile file : files) {
            file.display();
        }
    }

    /**
     * 添加文件
     *
     * @param file
     */
    public void add(AbsFile file) {
        files.add(file);
    }

    /**
     * 删除文件
     *
     * @param file
     */
    public void remove(AbsFile file) {
        files.remove(file);
    }

}

具体文件类:

public class TextFile extends AbsFile {

    public TextFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println("这是文本文件,文件名:" + super.getName());
    }
}
2016-10-20 10:5013