哈工大软件构造——设计模式学习

本文介绍了软件设计中的三种重要模式:适配器模式、装饰器模式和访问者模式。适配器模式用于接口转换,使不兼容的类能够协同工作;装饰器模式用于动态地给对象增加新的功能,保持类的封装性;访问者模式则将行为与数据结构分离,允许在不修改对象结构的情况下增加新的操作。这些模式在实际开发中经常被考察,是提升代码复用性和灵活性的关键工具。
摘要由CSDN通过智能技术生成

这部分由于时间匆忙,7中基本的设计模式,老师只讲了半个小时。下面对于几种设计模式做出自己的理解:从总接口,用户角度出发理解

1. Adapter:

客户现在只知道有一个方法叫method,method本来在class A中实现了,但是现在需要进行废弃,利用classB中的method2方法。此时就需要一个适配器,我们表面上,让客户调用我们的适配器,它调用的方法是method。但实际上我们在适配器中的method中的实现,返回的是B中的method1.从而用户最后得到的输出来自于method2。

public class EmployeeAdapter extends Consultant implements Employee{
    public  EmployeeAdapter(String name){
        super(name);
    }
    @Override
    public void showHappiness(){
        showEmotions();
    }
}

其中,employee中的方法是method,consultant中的是method1.

2. 装饰器模式: 

我们目标是生成一个产品,我们产品有许多构成部分,也可以衍生出很多种类。我们把其中最基础的拿出来,作为基类。余下的形成一个接口,内部有一些方法,需要被各种不同的衍生产品实现。在生成衍生产品过程中,我们首先需要实现一个抽象装饰类。

这个抽象装饰类,需要实现接口中定义的方法,同时要有构造器。因为其他的衍生产品,也需要和其他的装饰物品搭配使用。只有我们写了构造器,才能在子类中调用父类的方法,进而让多种装饰共同出现,形成不同的衍生品。

对于客户端的使用,最重要的是对象的建立。我们根据需要的衍生品的性质的不同,声明时候采取嵌套的形式。可以重复叠加很多层,但是注意,基类只能有一个,并且一定是最内层。产生的对象调用接口中共同实现的方法,即可实现我们的产品包装。

3. visitor模式:

这种设计模式有着比较特殊的架构:

首先我们有一个基本接口,是所有产品的共同属性,例如:可被购买(accept)。

于是,我们有很多的产品,可以实现这个接口,例如book,fruit等。并且加入了自己的属性和一些自己的方法。对于accept这一方法的实现,我们在产品中并不实现(重点),而是委托给visitor这一责任方进行实现。用代码表示,就是:

    public int accept(ShoppingCartVisitor visitor) {
        return visitor.visit(this);
    }

this表示的是这整个book的引用。我们将这个accept的实现转交给了visitor下的visit方法。所以现在我们需要创建visitor所属于的类。

这个类的实现非常简单,有什么产品需要被visit,就写几个visit方法。 

这个接口只是起到承上启下的作用,编程更加规范。

对于这里的visit,我们需要编写实现类。并且对于visit进行重写。实现的是具体方法,比如买多少,打几折等,如下:

@Override
    public int visit(Book book) {
        double cost = 0;
        if(book.getPrice()>10){
           cost = book.getPrice() -5;
        }
        else {
            cost = book.getPrice();
        }
        System.out.println(book.getBookName() + "'s price is " + cost);
        return (int)cost;
    }

最终客户的调用,一定是从最初的基本接口itemelement开始调用 ,否则会报错!

package visitor;

public class ShoppingCartClient {
    public static void main(String[] args){
        ItemElement[] items = new ItemElement[]{
                new Book(20,"math"), new Fruit(100, 2),new Book(6, "white night")
        };
        int total = calculateTotal(items);
        System.out.println("Total cost: " + total);
    }


    private static int calculateTotal(ItemElement[] items) {
        ShoppingCartVisitor visitor = new ShoppingCartImpl();
        int sum = 0;
        for(ItemElement item:items){
            sum = sum + item.accept(visitor);
        }
        return sum;
    }

}

以上就是对常见的三种设计模式的讲解,考试常考! 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上篇:软件设计模式例子代码  【例2.2】简单工厂方法模式-汽车保险  【例2.3】工厂方法模式-汽车保险  【例2.4】抽象工厂模式-房屋信息  【例2.5】生成器模式-房屋信息  【例2.6】单例模式-互联网连接  【例3.2】组合模式-五子棋代码  【例3.3】组合模式-空军指挥系统  【例3.4】组合模式-世界问候语  【例3.7】类适配器模式-客户信息验证  【例3.8】对象适配器模式-字符串排序  【例3.10】外观模式-安全系统  【例3.11】外观模式-椭圆功能  【例3.13】桥接模式-茶水机系统  【例3.14】桥接模式-几何立体体积  【例4.1】迭代器模式-矩阵搜索  【例4.2】迭代器模式-产品搜索  【例4.4】访问者模式-名牌鞋销售软件  【例4.5】访问者模式-计算机部件销售软件  【例4.6】命令模式-室内温度控制  【例4.7】命令模式-室内温度控制-2个GUI  【例4.8】命令模式-室内温度控制-3个GUI  【例4.10】中介者模式-旅游信息共享  【例4.11】中介者模式-海岛机场  【例4.13】策略模式-整数排序  【例4.14】策略模式-中国属相  【例4.16】状态模式-交通信号灯-设计1  【例4.16】状态模式-交通灯信号灯-设计2  【例4.16】状态模式-交通灯信号灯-设计3 下篇:软件体系结构例子代码  【例6.4】结构化设计-文件更新-C源代码  【例6.5】面向对象设计架构-文件更新  【例6.7】顺序批处理架构-文件更新  【例6.8】顺序批处理架构-图像处理  【例6.9】管道过滤器架构-主动过滤器  【例6.10】管道过滤器架构-被动过滤器  【例6.11】管道-过滤器架构-文件更新  【例6.12】管道-过滤器架构-图像处理程  【例6.14】事件体系结构-鼠标响应  【例6.17】事件体系结构-观察者模式-大草原1  【例6.18】事件体系结构-观察者模式-大草原2  【例6.19】事件体系结构-观察者模式-温度显示  【例6.21】层次架构-软件测试  【例6.22】层次架构-银行- Access数据库  【例6.23】MVC架构-二手车拍卖-无观察者  【例6.24】MVC架构-二手车拍卖-观察者-3个图形界面  【例6.25】MVC架构-二手车拍卖-观察者-1个图形界面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值