设计模式之结构型模式

1、适配器模式

复制代码
/**
 * 目标抽象类:定义客户所需接口
 */
public interface Target {
    void m1();
    void m2();
}

/**适配器模式:
 * 适用场景:(1)系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
 * (2)想创建一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类
 * 优点:适配器模式将目标类和适配者类解耦,通过引入适配器类来重用现有的适配者类,无需修改原有结构
 * 适配器类:适配者类和适配器类是关联关系,并且适配者作为对象被适配器引入,所以此种适配器也叫对象适配器
 */
public class Adapter implements Target {
    private ClassA classA;
    private ClassB classB;

    public Adapter(){
        classA=new ClassA();
        classB=new ClassB();
    }
    @Override
    public void m1(){
        classA.m1();
    }
    @Override
    public void m2(){
        classB.m2();
    }
}

/**
 * 适配者类
 */
public class ClassA {
    public void m1(){
        System.out.println("ClassA--m1");
    }
    public void m2(){
        System.out.println("ClassA--m2");
    }
}

/**
 * 适配者类
 */
public class ClassB {
    public void m1(){
        System.out.println("ClassB--m1");
    }
    public void m2(){
        System.out.println("ClassB--m2");
    }
}
复制代码

 

复制代码
/**
 * 缺省适配器类:定义成抽象类,使用空方法实现Target接口的所有接口。
 */
public abstract class AbstractAdapter implements Target {
    public void m1() {
    }

    public void m2() {
    }
}
复制代码

2、代理模式

复制代码
/**
 * 抽象主题类
 */
public interface Subject {
    void request();
}

/**
 * 代理模式
 * 代理类
 */
public class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy() {
        realSubject = new RealSubject();
    }

    public void proRequest() {
        System.out.println("proRequest");
    }

    @Override
    public void request() {
        proRequest();
        realSubject.request();
        afterRequest();
    }

    public void afterRequest() {
        System.out.println("afterRequest");
    }
}

/**
 * 真实主题类
 */
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject");
    }
}
复制代码

 

3 桥接模式

有pen和pencil两种笔(第一维度),如果让两种笔都实现蓝色和红色功能(第二维度),则使用桥接模式

复制代码
/**
 * 抽象类
 */
public abstract class Abstraction {
    protected Implementor implementor;//与Implementor接口建立关联关系

    public void setImplementor(Implementor implementor){
        this.implementor=implementor;
    }

    public abstract void operate();

}
public class Pen extends Abstraction {
    @Override
    public void operate() {
        System.out.println("paint by pen");
        implementor.paint();
    }
}

public class PenCil extends Abstraction {
    @Override
    public void operate() {
        System.out.println("paint by pencil");
        implementor.paint();
    }
}

public interface Implementor {
    void paint();
}    

public class BlueImplementor implements Implementor {
    @Override
    public void paint() {
        System.out.println("color is blue");
    }
}

public class RedImplementor implements Implementor {
    @Override
    public void paint() {
        System.out.println("color is red");
    }
}
复制代码

 4、组合模式

 

复制代码
public interface File {
    void operate();
}

public class Folder implements File {
    private List<File> files=new ArrayList<>();

    @Override
    public void operate() {
        for (File file : files){
            file.operate();// 此处递归调用了子节点的operate
        }
    }

    public List<File> getFiles() {
        return files;
    }

    public void addFiles(File file) {
        this.files.add(file);
    }
}

public class ImageFile implements File {
    @Override
    public void operate() {
        System.out.println("kill imageFile");
    }
}

public class TextFile implements File {
    @Override
    public void operate() {
        System.out.println("kill TextFile");
    }
}

public class Test {

    /**
     * 需求:有folder1{imageFile1,folder{imageFile,textFile}}的文件夹结构,现需要遍历folder1中的所有文件并进行杀毒操作

     * 组合模式是用来处理树形结构的模型
     * 容器类(Folder)和叶子类(ImageFile和TextFile)都实现了接口File,进而可以对容器类和叶子类进行统一处理
     * @param args
     */
    public static void main(String[] args){
        Folder folder=new Folder();
        ImageFile imageFile=new ImageFile();
        TextFile textFile=new TextFile();
        folder.addFiles(imageFile);
        folder.addFiles(textFile);

        Folder folder1=new Folder();
        ImageFile imageFile1=new ImageFile();
        folder1.addFiles(imageFile1);
        folder1.addFiles(folder);

        folder1.operate();
    }

}

输出:

kill imageFile
kill imageFile
kill TextFile

 
复制代码
posted @ 2020-01-15 13:33  第二人生Bonnie  阅读(150)  评论(0编辑  收藏  举报