23种设计模式详解(三)

1.模板方法模式(Templates Pattern)

模板方法模式就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。

车辆模板:

public abstract class CarModel {
    //启动
    protected abstract void start();
    //跑
    //为什么用final,让子类不能修改run()里面的方法调用顺序
    final public  void run(){
        //开始要启动
        this.start();
        //到了目的地就停车
        this.stop();
    };
    //停住
    protected abstract void stop();
}

宝马实现类:

public class BMW extends CarModel {
    @Override
    public void start() {
        System.out.println("宝马启动");
    }
    @Override
    public void stop() {
        System.out.println("宝马停车");
    }
}

悍马实现类:

public class Hummer extends CarModel {
    @Override
    public void start() {
        System.out.println("悍马启动");
    }
    @Override
    public void stop() {
        System.out.println("悍马停车");
    }
}

测试:

public class Test {
    public static void main(String[] args){
        BMW bmw=new BMW();
        bmw.run();
        Hummer hm=new Hummer();
        hm.run();

    }
}

结果:

2.建造者模式(Build Pattern)

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。

sender:

public interface Sender {
    public void send();
}

smsSender:

public class smsSender implements Sender {
    @Override
    public void send() {
        System.out.println("发短信");
    }
}

mailSender:

public class mailSender implements Sender {
    @Override
    public void send() {
        System.out.println("发邮件");
    }
}

build:

public class build {
    private List<Sender> phoneList=new ArrayList<>();
    public void mailSend(int count){
        for(int i=0;i<count;i++){
            phoneList.add(new mailSender());

        }
    }
    public void smsSend(int count){
        for(int i=0;i<count;i++){
            phoneList.add(new smsSender());

        }
    }
}

测试:

public class Test {
    public static void main(String[] args){
        build b=new build();
        b.mailSend(10);
    }
}

3.桥梁模式(Bridge Pattern)

举例,我有一家公司,现在我要成立两家子公司,一个是房地产公司,一个是服装公司,但是我总公司要监督这两家子公司。

产品:

public abstract class Product {
    //生产
    protected abstract void produce();
    //销售
    protected abstract void sell();

}

服装:

public class Clothes extends Product {
    @Override
    public void sell() {
        System.out.println("夏天到了,生产了一批高端T恤");
    }

    @Override
    public void produce() {
        System.out.println("T恤全部买完");
    }
}

房地产:

public class House extends Product {
    @Override
    public void produce() {
        System.out.println("投资盖了一座大楼");
    }

    @Override
    public void sell() {
        System.out.println("房子全部高价售罄");
    }
}

总公司:

public abstract class Company {
    private Product product;

    public Company(Product product) {
        this.product = product;
    }

    //赚钱
    public void makeMoney(){
        this.product.produce();
        this.product.sell();
    }

}

房地产公司:

public class houseCorp extends Company {
    @Override
    public void makeMoney() {
        super.makeMoney();
        System.out.println("赚钱了");
    }

    public houseCorp(House house) {
        super(house);
    }
}

服装公司:

public class clothesCorp extends Company {
    public clothesCorp(Clothes clothes) {
        super(clothes);

    }
    @Override
    public void makeMoney() {
        super.makeMoney();
        System.out.println("赚钱了");
    }
}

测试:

public class Test {
    public  static void main(String[] args){
        House h=new House();
        houseCorp hc=new houseCorp(h);
        hc.makeMoney();
    }
}

结果:

以后我的房地产公司或者服装公司要不要转型做其他产品?我要不要在成立一家子公司?如果这样我要去修改代码?不用,成立子公司就去继承Company,转型发展其他产品线就去继承Product,不用修改源代码,这就是桥梁模式的好处。

4.命令模式(Command Pattern)

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。

命令接口:

public interface Command {
    public void exe();
}

命令接口的实现:

public class myCommand implements Command{
    private Soldier soldier;

    public myCommand(Soldier soldier) {
        this.soldier = soldier;
    }

    @Override
    public void exe() {
        soldier.action();
    }
}

司令:

public class Commander {
    private Command command;
    public Commander(Command command) {
        this.command = command;
    }
   public void action(){
        command.exe();
   }
}

士兵:

public class Soldier {
    public void action() {
        System.out.println("收到命令");
    }
}

测试:

public class Test {
    public static void main(String[] args){
        Soldier sd=new Soldier();
        Command cm=new myCommand(sd);
        Commander cmd=new Commander(cm);
        cmd.action();
    }
}

结果:

命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!

源码:

链接:https://pan.baidu.com/s/1p8YU_3A1HQ4v8QiPrtINsA

密码:w5q5

原文发布于微信公众号 - Java大联盟(javaunion)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

三分钟理解“简单工厂模式”——设计模式轻松掌握

实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。 普...

35212
来自专栏阿杜的世界

《重构》阅读笔记-代码的坏味道

开发者必须通过实践培养自己的经验和直觉,培养出自己的判断力:学会判断一个类内有多少个实例变量算是太大、学会判断一个函数内有多少行代码才算太长。

592
来自专栏即时通讯技术

字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。

1002
来自专栏陈纪庚

使用装饰者模式做有趣的事情

装饰者模式是一种为函数或类增添特性的技术,它可以让我们在不修改原来对象的基础上,为其增添新的能力和行为。它本质上也是一个函数(在javascipt中,类也只是函...

622
来自专栏desperate633

一个故事带你搞懂ASCII,Unicode字符集和UTF-8编码

快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char和nchar,那个n据说是指unicode的数据,这个是什么意思。" ...

822
来自专栏写代码的海盗

SEO是件贼有意思的事情 golang入坑系列

这两天迷上了SEO。真心看不起百度的竞价排名,但作为一个商业网站,赚钱是一件无可厚非的事情。只做活雷锋,没有大金主是做不长的。做完功课后,发现百度和google...

2775
来自专栏Android 开发者

[译] Kotlin 揭秘:理解并速记 Lambda 语法

在奥地利旅行期间,我参观了维也纳的奥地利国家图书馆。特别是国会大厅,这个令人惊叹的空间感觉就像印第安纳琼斯电影中的一些东西。房间周围的空间是这些门被装在架子上,...

790
来自专栏java思维导图

自下向上的编写容易阅读的代码(上)

我在 关于极简编程的思考 中曾提到要编写可阅读的代码。因为代码是编写一次,阅读多次。 阅读者包括代码编写者,以及后来的维护人员。能让阅读代码更轻松,有利于增强项...

3378
来自专栏web前端教室

[先行者课程] -- 用js实现倒计时功能的业务逻辑

今天是2017年3月19号,周日,我们一起来学习“倒计时”这个前端“需求”。 一,看一下上周的作业,视差滚动的作业; 二,开始分享学习倒计时应用。 因为时间的关...

2005
来自专栏ACM小冰成长之路

KWIC-C/C++实现

吐槽 最近我们 JavaJava 老师不知道为啥非要我用 C/C++C/C++ 来实现 KWICKWIC,但是因为没有上过课,不知道这个东西是干嘛的,所以想网上...

19410

扫码关注云+社区