设计模式——外观模式

外观模式

1、概念

思想

迪米特法则;依赖倒置原则

定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中的方法,从而外观模式让客户和子系统之间避免了紧耦合。

核心思想

由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统,客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法。
与适配器模式的区别
适配器模式是将一个对象包装起来以改变其接口,而外观是将一群对象“包装”起来以简化其接口。即适配器是将接口转换为不同的接口,而外观模式是提供一个统一的接口来简化接口。

角色

门面(Facade)角色

客户端调用这个角色的方法。该角色知道相关的一个或多个子系统的功能和责任,该角色会将从客户端发来的请求委派带相应的子系统中去。

子系统(subsystem)角色

可以同时包含一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用或被门面角色调用。对于子系统而言,门面仅仅是另外一个客户端,子系统并不知道门面的存在。

2、使用

代码实现

门面(Facade)角色
package com.csk.mode.facade.service;

public class Fund {
    Stock1 stock1;
    Stock2 stock2;
    Stock3 stock3;
    NationalDebt1 nationalDebt1;
    Realty1 realty1;

    public Fund() {
        stock1 = new Stock1();
        stock2 = new Stock2();
        stock3 = new Stock3();
        nationalDebt1 = new NationalDebt1();
        realty1 = new Realty1();
    }

    public void  buyFund(){
        stock1.buy();
        stock2.buy();
        stock3.buy();
        nationalDebt1.buy();
        realty1.buy();
    }

    public void sellFund(){
        stock1.sell();
        stock2.sell();
        stock3.sell();
        nationalDebt1.sell();
        realty1.sell();
    }
}

子系统(subsystem)角色
package com.csk.mode.facade.service;

public class Stock1 {
    public void sell(){
        System.out.println("股票1卖出");
    }

    public void buy(){
        System.out.println("股票1买进");
    }
}
package com.csk.mode.facade.service;

public class Stock2 {
    public void sell(){
        System.out.println("股票2卖出");
    }

    public void buy(){
        System.out.println("股票2买进");
    }
}
package com.csk.mode.facade.service;

public class Stock3 {
    public void sell(){
        System.out.println("股票3卖出");
    }

    public void buy(){
        System.out.println("股票3买进");
    }
}
package com.csk.mode.facade.service;

public class NationalDebt1 {
    public void sell(){
        System.out.println("国债1卖出");
    }

    public void buy(){
        System.out.println("国债1买进");
    }
}
package com.csk.mode.facade.service;

public class Realty1 {
    public void sell(){
        System.out.println("房地产1卖出");
    }

    public void buy(){
        System.out.println("房地产1买进");
    }
}
启动类
package com.csk.mode.facade.controller;

import com.csk.mode.facade.service.*;

public class FacadeMain {
    public static void main(String[] args) {
        Fund fund = new Fund();
        // 基金购买
        fund.buyFund();
        // 基金赎回
        fund.sellFund();
    }
}

截图
在这里插入图片描述

使用场景

1、为一个复杂的子系统提供一个简单的接口;
2、提供子系统的独立性;
3、在层次化结构中,可以使用外观模式定义系统中每一层的入口。例如:三层架构;

优缺点

优点

1、外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
2、外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

缺点

如果增加新的子系统可能需要修改外观类代码和客户端的源代码。违背了“开闭原则”。----不可避免

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值