首页 > 其他分享 >设计模式学习(4)分开考虑

设计模式学习(4)分开考虑

时间:2022-08-17 20:46:52浏览次数:58  
标签:学习 继承 void 模式 分开 实现 设计模式 public impl

桥接模式

将类功能的层次结构和实现结构分离开

实现层次结构:在模板方法模式中,我们通过重写父类的方法来达到实现自己的功能的目的。这里使用的继承只是子类为了在父类的接口下实现自己的方法。

功能层次结构:继承一个类,写一个新的方法。这里使用继承是为了给父类添加新的方法,但是又能继续用父类的方法。

桥接模式可以将实现层次结构和功能层次结构分离开。将这两种继承显示出来。

例子

我们用桥接模式实现这样一个功能。现在有一个显示类(Display),它可以显示一个字符串。

现在我们希望添加两个功能,一个是能显示的时候添加一个包围盒,另一个是能输出5次。

首先,显示的时候添加包围盒,就是怎么显示的问题。这个可以通过派生父类并重写父类的模板函数来实现。

其次,输出5次是新的功能,这个可以通过派生父类,并新增加一个方法来实现。

但是这样实现会导致功能层次和实现层次的继承混乱。

所以我们这里单独把两个抽出来,功能层次的继承,当作类的继承。而实现层次的继承,放到一个xxxImpl类中,并通过继承这个类来实现子类需要的实现方法。

// 这是个显示的基类,里面保存了一个DisplayImpl来指代不同的显示方法实现
public class Display {
    private DisplayImpl impl;

    public Display(DisplayImpl impl) {
        this.impl = impl;
    }

    public void open() {
        impl.rawOpen();
    }

    public void print() {
        impl.rawPrint();
    }

    public void close() {
        impl.rawClose();
    }

    public final void display() {
        open();
        print();
        close();
    }
}

// 这是实现显示的方法
public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

// 这个继承是子类实现了自己的方法
public class StringDisplayImpl extends DisplayImpl{

    private String string;
    private int width;
    public StringDisplayImpl(String string) {
        this.string = string;
        this.width = string.getBytes().length;
    }

    @Override
    public void rawOpen() {
        printLine();
    }

    @Override
    public void rawPrint() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void rawClose() {
        printLine();
    }

    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < width;i ++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

// 这个继承是为了给display添加新功能
public class CountDisplay extends Display{
    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }

    public void multiDisplay(int times) {
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

注意

  • 为什么要分开呢?更容易扩展。
  • 继承是强关联,委托是弱关联

相关设计模式

  • 模板方法模式
  • 抽象工厂模式
  • 适配器模式

策略模式

为了解决问题,程序会编写算法。使用策略模式可以很容易的去替换这些算法。

例子

用策略模式模拟一下猜拳

现在有两种出拳算法

  • 如果上一把赢了,下一把用同样手势(Winning Strategy)
  • 根据上一局的手势,从概率上计算下一句的手势(Prob Strategy)

代码太复杂了。。就不贴了,以后再说

策略模式比较简单,就是把一些解决问题的算法抽象成一个Strategy的派生类。然后在运行过程中就可以替换这些算法了。

其实去调用不同的函数也是可以的。

相关设计模式

  • 享元模式,不重要
  • 抽象工厂模式
  • 状态模式

标签:学习,继承,void,模式,分开,实现,设计模式,public,impl
From: https://www.cnblogs.com/destinyzk/p/16596662.html

相关文章

  • 学习路线
    选65MS高级设计考试时间两小时100分9.24考试版本MicrosoftOffice2016win7一些基础知识搜索我要自学网二级MSOffice考试教程(链接分享不了考啥操作题按步骤......
  • q-binomial 学习笔记
    主要可以解决一些生成函数问题,网上资料不是很多,orzzaky的博客。part1q-Binomial考虑一个很经典的模型,就是从\((0,0)\)出发,每次向上或者向右走一格,走到\((n,m)\)的......
  • zk学习案例_服务器动态上下线
    前言我的电脑内存只有8G,搭建的集群虚拟机配置如下,本案例也是可以跑的,学习视频为尚硅谷的Zookeeper教程:https://www.bilibili.com/video/BV1to4y1C7gw?p=1&vd_source=c85b......
  • 学习:python 第三方模块介绍
    第三方模块是由第三方个人或者组织使用python开发,需要先下载安装才能使用的工具包第三方模块来自各行各业使用python的开发人员为了不同行业的不停业务提供了解决方案 ......
  • 2022-08-16 第五组 赖哲栋 学习笔记
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......
  • 2022-08-17 第五组 赖哲栋 学习笔记
    DQL查询语言子查询按照结果集的行列数不同,子查询可以分为以下几类:标量子查询:结果集只有一行一列(单行子查询)列子查询:结果集有一列多行行子查询:结果集有一行多列表子......
  • 学习:python 内置模块datetime
    importtimeimportdatetime#获取当前的日期时间n=datetime.datetime.now()print(n)#获取一个指定时间da=datetime.datetime(2018,2,13,5,23,45)print(da)#日期......
  • vue3学习第一天
    vue3简介:1、性能的提升(打包快,渲染快,内存少)2、源码的升级使用proxy代替defineProperty实现响应式重写虚拟dom的实现和Tree-Shaking(让打包体积变小,应用到webpack)3、更好......
  • 学习:python 内置模块 time
    importtimes1=time.time()#获取一个时间戳:当前时间距离1979年元旦0时的秒数,用户计算程序执行秒数开始前记录一次结束后记录一次相减forxinrange(1,10001):......
  • 学习:python 内置模块random
    importrandom#引入模块#创建的文件名项目的名字不要与引入的模块名重复r1=random.randint(1,6)#生成范围随机数r2=random.uniform(1,6)#生成指定范围随机浮点数r3=......