代理模式

代理模式 : 你想做一件事,自己不想做,想让别人给你完成。
1、静态代理
2、动态代理

1、静态代理

优点:可以对目标对象进行功能扩展和切换
缺点:每次都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改

以业主装修房子为例
业主:在某个小区买了个毛坯房,现在想装修,自己弄不了,就想找装修公司来装修。
装修公司a:欧美风
装修公司b:工业风
装修公司c:简约风

想要做的事情(装修)

interface DecorateHouse {
    void decorateHouse();
}

欧美风装修公司

class EuropeanstyleCompany implements DecorateHouse {
    @Override
    public void decorateHouse() {
        System.out.println("给你装修成欧美风的房子");
    }
}

工业风装修公司

class IndustrialstyleCompany implements DecorateHouse {
    @Override
    public void decorateHouse() {
        System.out.println("给你装修成工业风的房子");
    }
}

简约风装修公司

class SimplestyleCompany implements DecorateHouse {
    @Override
    public void decorateHouse() {
        System.out.println("给你装修成简约风的房子");
    }
}

业主

class HouseOwner implements DecorateHouse {
    public static final int EUROPEAN_STYLE = 1;//欧美风
    public static final int INDUSTRIAL_STYLE = 2;//工业风
    public static final int SIMPLE_STYLE = 3;//简约风
    private DecorateHouse decorateCompany;

    private HouseOwner() {}

    private static class Holder {
        private static HouseOwner instance = new HouseOwner();
    }

    public static HouseOwner getInstance() {
        return Holder.instance;
    }

    public void selcetStyle(int style) {
        switch (style) {
            case EUROPEAN_STYLE:
                decorateCompany = new EuropeanstyleCompany();
                break;
            case INDUSTRIAL_STYLE:
                decorateCompany = new IndustrialstyleCompany();
                break;
            case SIMPLE_STYLE:
                decorateCompany = new SimplestyleCompany();
                break;
        }
    }

    @Override
    public void decorateHouse() {
        if (decorateCompany != null) {
            decorateCompany.decorateHouse();
        }
    }
}

最后装修这件事就成了业主选一家喜欢的装修公司就完了

HouseOwner.getInstance().selcetStyle(HouseOwner.EUROPEAN_STYLE);
HouseOwner.getInstance().decorateHouse();

2、动态代理

你可能感兴趣的:(#,设计模式,java,设计模式)