代理模式 适配器模式 装饰模式 实例_西蒙马的博客-程序员宅基地

技术标签: Java  设计模式  

代理模式

// Calculate.java
public interface Calculate {
    
    int add(int a, int b);
}


// Calculator.java
public class Calculator implements Calculate {
    
    public int add(int a, int b) {
        return a + b;
    }
}


// CalculatorProxy.java - 代理
public class CalculatorProxy implements Calculate {
    
    private Calculator calculator;

    public CalculatorProxy(Calculator calculator) {
        this.calculator = calculator;
    }

    public int add(int a, int b) {
        System.out.println("calculate " + a + " + " + b);
        return calculator.add(a, b);
    }
}


// ProxyTest.java
public class ProxyTest {
    
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        CalculatorProxy calculatorProxy = new CalculatorProxy(calculator);
        int sum = calculatorProxy.add(4, 6);
        System.out.println(sum);
    }
}

// 输出结果:
// calculate 4 + 6
// 10

适配器模式

// RedFirer.java
public interface RedFirer {
    
    void burn();
}


// Kyo.java
public class Kyo implements RedFirer {
    
    public void burn() {
        System.out.println("燃烧吧,我的赤焰!");
    }
}


// GreenFirer.java
public interface GreenFirer {
    
    void burn();
}


// Ash.java
public class Ash implements GreenFirer {
    
    public void burn() {
        System.out.println("燃烧吧,我的翠焰!");
    }
}


// FakeKyo.java - 适配器
public class FakeKyo implements RedFirer {
    
    private GreenFirer greenFirer;

    public FakeKyo(GreenFirer greenFirer) {
        this.greenFirer = greenFirer;
    }

    public void burn() {
        greenFirer.burn();
    }
}


// AdapterTest.java
public class AdapterTest {
    
    public static void main(String[] args) {
        GreenFirer ash = new Ash();
        RedFirer fakeKyo = new FakeKyo(ash);
        fakeKyo.burn();
    }
}

// 输出结果:
// 燃烧吧,我的翠焰!

装饰模式

// Learn.java
public interface Learn {
    
    void learnBasic();
    void writeDemo();
    void conclude();
    void learnSth();
}


// NormalLearn.java
public class NormalLearn implements Learn {
    
    public void learnBasic() {
        System.out.println("学习基础知识....");
    }

    public void writeDemo() {
        System.out.println("编写测试....");
    }

    public void conclude() {
        System.out.println("总结....");
    }

    public void learnSth() {
        learnBasic();
        writeDemo();
        conclude();
    }
}


// AbstractLearn.java - 装饰器
public abstract class AbstractLearn implements Learn {
    
    private final Learn learn;

    public AbstractLearn(Learn learn) {
        this.learn = learn;
    }

    public void learnBasic() {
        learn.learnBasic();
    }

    public void writeDemo() {
        learn.writeDemo();
    }

    public void conclude() {
        learn.conclude();
    }

    public void learnSth() {
        learnBasic();
        writeDemo();
        conclude();
    }
}


// LazyDecorator.java
public class LazyDecorator extends AbstractLearn {
    
    public LazyDecorator(Learn learn) {
        super(learn);
    }

    public void copyDemo() {
        System.out.println("抄袭别人的测试....");
    }

    public void writeDemo() {
        super.writeDemo();
        copyDemo();
    }
}


// QuickDecorator.java
public class QuickDecorator extends AbstractLearn {
    
    public QuickDecorator(Learn learn) {
        super(learn);
    }

    public void speedUp() {
        System.out.println("加快打字速度....");
    }

    public void conclude() {
        super.conclude();
        speedUp();
    }
}


// DecoratorTest.java
public class DecoratorTest {
    
    public static void main(String[] args) {
        Learn learn = new NormalLearn();
        learn = new LazyDecorator(learn);
        learn = new QuickDecorator(learn);
        learn.learnSth();
    }
}

// 输出结果:
// 学习基础知识....
// 编写测试....
// 抄袭别人的测试....
// 总结....
// 加快打字速度....
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/GuuInBelieve/article/details/78848692

智能推荐

mysql启动怎么跳过坏页_Mysql启动问题_学海无涯八宝粥的博客-程序员宅基地

[[email protected]]#./bin/mysqld_safe--user=mysql&[[email protected]]#Startingmysqlddaemonwithdatabasesfrom/usr/local/web/mysql/varSTOPPINGserverfrompidfile/usr/local/web/mysql/var...[[email protected] mysql]# ./bin/...

小程序动态监听输入金额是否正确_CherryCola_zjl的博客-程序员宅基地

首先input 的type 需为 digit 只能输入 数字以及点getFloatNum(num) { // 为空或为0 if (!num) { return 0 } // 输入 0. 或者 1.0 的时候保持状态,让用户继续输入。这个是保证用户输入 0.0. 或者0...等不合规的情况 if (/^\d+\.0?$/.test(num)) {...

FTP登入错误详解_季海晨的博客-程序员宅基地

1、 无法连接到远程服务器。Socket 错误 = #10060。 原因:对方未开FTP或者无法连通   端口错误(默认21)2、530 Sorry, no ANONYMOUS access allowed 原因:帐号密码错误或者拒绝登入 3、Too many users - please try again later. 原因:限制了登入的人数4、530 Not logged in, only ...

python 在sublime上搭建谷歌翻译器平台_love萌萌loli的博客-程序员宅基地_sublime能自动翻译吗

1、 首先安装python相应的数据包,使用清华镜像源安装pip install google_trans_new -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple需要requests 和google_trans_new 两个库来支持,其中google_trans_new 是google翻译所需要的库2、然后安装sublime,直

ASP.NET MVC 开发模式(下)基础完结篇_黑夜中的潜行者的博客-程序员宅基地_未能在以下路径中找到布局页

模型的绑定与验证;通过模型绑定获取表单数据;通过绑定基本类型获取表单数据;对模型数据进行验证;通过EF框架实现删除和修改;通过EF框架删除数据;通过EF框架修改数据;实现登录及MVC Filter的应用;AuthorizeFilter筛选器;ActionFilter过滤器;ResultFilter过滤器;ExceptionFilter过滤器;布局页和分部视图;母版视图的基本使用( @RenderBody );母版中的页面片段(@RenderSection);分部视图

安装sql server 2016时遇到的问题_icogan的博客-程序员宅基地

WIN10安装sql server2016时遇到的问题问题:您试图连接的 SQL Server 实例未安装 Data Quality Services。若要最终完成 Data Quality Services 安装,请运行 DQS 安装程序脚本。 有关详细信息,请参考 Data Quality Services 安装指南或联系您的管理员。方法:1.WMI 有没有开我的电脑右键 ->...

随便推点

区块链适合的应用场景_Gardenia Minwentel的博客-程序员宅基地_区块链技术适合的场景具有的特征是

区块链虽然是革命性的技术,但是经过以前的文章的介绍,相信大部分读者都知道区块链不是万能的,其实很多企业应用上完全不需要的利用的到区块链技术,区块链技术有其自身的特点,今天为大家介绍区块链适合的几个应用场景1敏感核心数据记录场景区块链不同于传统数据库,大部分性能设计弱于传统数据库。所以你一开始就需要知道什么地方用数据库,什么地方用区块链,数据库适合记录一种结构性的信息,可以是传统的关系型数据库,...

Python---字典_我是六六六呀的博客-程序员宅基地

# 有C 和C++基础的学习笔记# 参考书《Python编程从入门到实践》# Python 3# 所有代码不给出运行结果,可直接copy 示范:# coding=utf-8# 存储了两个 键-值对;'color'是一个键,与之相关联的值为'green'alien_0 = {'color':'green','points':5} # 访问字典中的值:指定字典名和放...

table设置td文本超出为省略号无效的解决方法_Sc_font的博客-程序员宅基地

td关键代码如下:white-space: nowrap;/*控制单行显示*/overflow: hidden;/*超出隐藏*/text-overflow: ellipsis;/*隐藏的字符用省略号表示*/table代码如下:table-layout: fixed;(允许设置列宽,通过th) ...

SQL Server的基本可视化操作_张金威的博客-程序员宅基地_可视化sql

处理数据的常用操作:增加记录,删除记录,修改记录,查询记录。下面以宿舍的用电,用水情况统计作为例子,实现增加,删除,修改功能。首先新建一个数据库,名字任取,由于为基本的演示过程,其他参数取默认即可。可以看到,默认情况下会生成两个文件。在新建的数据库下新建表,本例中包含三个参数:宿舍号,用水量,用电量。宿舍号为char类型,不能为空。用水,用电量为整型,可以为空。点击保存后刷新,可以...

OpenMPI(一) 点对点通信_weixin_34033624的博客-程序员宅基地

为什么80%的码农都做不了架构师?>>> ...

推荐文章

热门文章

相关标签