设计模式系列(结构型模式)之一 外观模式

了解下结构型模式

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。结构型模式可以分为类结构型模式和对象结构型模式:
类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。
对象结构型模式关心类与对象的组合,通过关联关系使得在一 个类中定义另一个类的实例对象,然后通过该对象调用其方法。 根据“合成复用原则”,在系统中尽量使用关联关系来替代继 承关系,因此大部分结构型模式都是对象结构型模式。
结构型模式包含的模式有(重要程度:5分为满分):
外观模式(Facade)
重要程度:5
适配器模式(Adapter)
重要程度:4
组合模式(Composite)
重要程度:4
代理模式(Proxy)
重要程度:4
桥接模式(Bridge)
重要程度:3
装饰模式(Decorator)
重要程度:3
享元模式(Flyweight)
重要程度:1

外观模式

外观模式又叫门面模式,提供了统一得接口,用来访问子系统中的一群接口。
是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

适用于:
子系统越来越复杂,增加外观模式提供简单接口调用;
构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。

优点:
简化了调用过程,无需了解深入子系统;
减低耦合度;
更好的层次划分;
符合迪米特法则。

缺点:
增加子系统,拓展子系统行为容易引入风险;
不符合开闭原则。

外观模式主要有以下主要角色:
外观(Facade)角色:为多个子系统对外提供一个共同的接口。
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
客户(Client)角色:通过一个外观角色访问各个子系统的功能。
1.创建一个下单的食物类

//创建一个下单的食物类
public class Food {
    private String name;
    private int count;

    public String getName() {
        return name;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

2.下单一般有下单,支付,配送三个流程,先创建这三个服务流程

// 下单服务
public class OrderService {
    public boolean Order(Food food){
        System.out.println("已成功下单"+food.getName()+food.getCount()+"份");
        return true;
    }
}
//支付服务
public class PayService {
    public boolean pay(Food food){
        System.out.println(food.getName()+"支付了20元");
        return true;
    }
}
//配送服务
public class SendService {
    public void send(Food food){
        System.out.println(food.getName()+"已接单,配送中");
    }
}

3.然后创建一个统一的服务,来聚合管理这些服务,客户端只需要和这个统一的服务交互即可

//下单聚合服务
public class FoodService {
   private OrderService orderService=new OrderService();
   private PayService payService=new PayService();
   private SendService sendService=new SendService();

   public void doOrder(Food food){
       if(orderService.Order(food)){
           if(payService.pay(food)){
               sendService.send(food);
           }
       }
   }
}

4.测试输出

public class Test {
    public static void main(String[]args){
        Food food=new Food();
        food.setName("大鸡腿");
        food.setCount(2);
        FoodService foodService=new FoodService();
        foodService.doOrder(food);

    }
}
//已成功下单大鸡腿2份
//大鸡腿支付了20元
//大鸡腿已接单,配送中

从上面的输出可以看到,客户端只需要调用FoodService 即可,无需关系内部具体经历了多少个步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值