策略模式场景举例

容错恢复机制
        容错恢复机制是应用程序开发中非常常见的功能。那么什么是容错恢复呢?简单点说就是:程序运行的时候,正常情况下应该按照某种方式来做,如果按照某种方式来做发生错误的话,系统并不会崩溃,也不会就此不能继续向下运行了,而是有容忍出错的能力,不但能容忍程序运行出现错误,还提供出现错误后的备用方案,也就是恢复机制,来代替正常执行的功能,使程序继续向下运行。
        举个实际点的例子吧,比如在一个系统中,所有对系统的操作都要有日志记录,而且这个日志还需要有管理界面,这种情况下通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面,然后在合适的时候把文件中的记录再转录到数据库中。
        对于这样的功能的设计,就可以采用策略模式,把日志记录到数据库和日志记录到文件当作两种记录日志的策略,然后在运行期间根据需要进行动态的切换。
        在这个例子的实现中,要示范由上下文来选择具体的策略算法,前面的例子都是由客户端选择好具体的算法,然后设置到上下文中。
        下面还是通过代码来示例一下。
(1)先定义日志策略接口,很简单,就是一个记录日志的方法,示例代码如下:

/**

 * 日志记录策略的接口

 */

public interface LogStrategy {

    /**

     * 记录日志

     * @param msg 需记录的日志信息

     */

    public void log(String msg);

}
 


(2)实现日志策略接口,先实现默认的数据库实现,假设如果日志的长度超过长度就出错,制造错误的是一个最常见的运行期错误,示例代码如下:

/**

 * 把日志记录到数据库

 */

public class DbLog implements LogStrategy{

    public void log(String msg) {     

       //制造错误

       if(msg!=null && msg.trim().length()>5){

           int a = 5/0;

       }

       System.out.println("现在把 '"+msg+"' 记录到数据库中");

    }

}
 

接下来实现记录日志到文件中去,示例代码如下:

/**

 * 把日志记录到文件

 */

public class FileLog implements LogStrategy{

    public void log(String msg) {

       System.out.println("现在把 '"+msg+"' 记录到文件中");

    }

}
 

(3)接下来定义使用这些策略的上下文,注意这次是在上下文里面实现具体策略算法的选择,所以不需要客户端来指定具体的策略算法了,示例代码如下:

 

(4)看看现在的客户端,没有了选择具体实现策略算法的工作,变得非常简单,故意多调用一次,可以看出不同的效果,示例代码如下:

 

 (5)小结一下,通过上面的示例,会看到策略模式的一种简单应用,也顺便了解一下基本的容错恢复机制的设计和实现。在实际的应用中,需要设计容错恢复的系统一般要求都比较高,应用也会比较复杂,但是基本的思路是差不多的。

 作者演示了策略的一种变体。

这个例子同时说明了设计中的另外一个重要的概念,单一职责原理。

单一职责原则(SRP),就一个类而言应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计

当变化发生时,设计会遭受到意想不到的破坏。

转载于:https://www.cnblogs.com/zhangshitong/p/6007607.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php写抢票脚本,火车票抢票python代码公开揭秘!

市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单。下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事。该代码仅供参考,主要用于大家沟通交流&#xff0…

python不用加号实现加法

问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator and -.Example:Given a 1 and b 2, return 3. class Solution(object):def getSum(self, a, b):""":type a: int:type b: int:rtype: int"""…

.net与mysql,ASP.NET与MySql的连接

ASP.NET与MySql的连接1.数据连接方式ASP.NET本身的数据访问ADO.NET不支持对于MySql的连接和查询,但是MySQL官网上均提供了多种ASP.NET连接到MySQL的方式:(1)ODBC驱动的访问方式:mysql-connector-odbc-5.1.5-win32.msi,ODBC(2)ADO.…

php 反射 视频教程,php 实现反射

定义一个人类class person{public $name;public $gender;public function say(){//echo $this->name."say".$this->gender;}public function __set($name,$value){$this->name$value;}public function __get($name){if(!isset($name)){echo "未设置&qu…

代理模式——HeadFirst设计模式学习笔记

代理模式:为另一个对象提供一个替身或占位符控制这个对象的访问 特点: 让代理对象控制对象的访问,被代理对象可以是远程对象(远程代理),创建开销较大对象(虚拟代理),或需…

cursor用法java,Cursor的基本使用方法

Cursor的基本使用方法今天在用到Cursor的时候发现,有很多游标相关的知识还是有欠缺,在网上搜了篇基础讲解的文,觉得还不错,自己整理了一下发上来。虽然很基础,但是有一些内容之前确实没有很扎实得掌握,所以…

$(document).ready()与window.onload的区别

1、执行时间: window.onload要等到页面所有元素加载完毕才执行,包括(图片、flash等) $(document).ready()在DOM结构绘制完毕后就执行,不必等到加载完毕。 2、执行个数: 如果有多个window.onload&#xff0c…

mongo java 日期,Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射

我有Java 8日期/时间字段的简单文档Documentpublic class Token {private Instant createdAt;...}我希望坚持使用Spring Data MongoDB 1.5版.但java.time.Instant类型的字段无法正确反序列化,因为MappingMongoConverter缺少java.time类的转换器.在Spring 4中,我找到了带有不同转…

win7(64位)php5.5-Apache2.4-mysql5.6环境安装

win7(64位)安装搭建 php-5.5.10 apache2.4.7 mysql-5.6.16 环境 工具/原料 php-5.5.10-Win32-VC11-x64.zip 下载地址: http://windows.php.net/download/ httpd-2.4.7-win64-VC11.zip 下载地址: http://www.apachelounge.com/download/ mysql-5.6.16-win…

matlab中计算不等式的解,大神们,求个解多元一次不等式的代码,要所有整数解...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼用lingo做的&#xff0c;我lingo特烂328*a1470*b1300*c570*d3750*e2080*f3900*g3070*h<9000;gin(a) ;gin(b) ;gin(c) ;gin(d) ;gin(e) ;gin(f) ;gin(g) ;gin(h) ;结果&#xff1a;Feasible solution found.Infeasibilities: 0.0…

14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例

14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端&#xff0c;A和B:Jekins:/root# mysql -uroot -p1234567 -e"SHOW ENGINE INNODB STATUS\G;" | grep -i dead Warning: …

php开发环境 ubuntu,Ubuntu配置PHP开发环境

开发环境安装目前web服务器有很多&#xff0c;本文安装Apache服务器&#xff1b;本文使用的服务器是Mysql服务器。sudo apt install apache2常用命令重启Apache&#xff1a;sudo /etc/init.d/apache2 restart重启php&#xff1a;sudo /etc/init.d/php-fapm restart配置apache服…

Jmeter java.lang.OutOfMemoryError: GC overhead limit exceeded

使用这个jmeter工具测试时&#xff0c;遇到这么个gc错误&#xff0c;网上找到了解决方案。原因是jmeter默认分配内存的参数很小&#xff0c;好像是256M吧。故而解决方法&#xff0c;就是增加内存&#xff1a; set HEAP-Xms4g -Xmx4gset NEW-XX:NewSize1g -XX:MaxNewSize1g 注意…

php基础知识总结大全,php基础知识回顾 —— 常量

您现在的位置是&#xff1a;网站首页>>PHP>>phpphp基础知识回顾 —— 常量发布时间&#xff1a;2019-01-23 17:23:08作者&#xff1a;wangjian浏览量&#xff1a;489点赞量&#xff1a;0在PHP中有这样一类变量&#xff0c;当变量值被定义之后&#xff0c;它的值就不…

Java 配置maven及阿里云镜像

一&#xff1a;配置maven 1.下载maven&#xff0c;选择Binary tar.gz&#xff0c;解压拷贝到目录/usr/local/ https://maven.apache.org/download.cgi2.配置系统默认maven路径&#xff0c;打开配置文件 $ open ~/.bash_profile写入路径信息 export M2_HOME/usr/local/apache-ma…

php中get_featured_posts()是什么意思,WordPress的Get_Posts()函数详解

WP中获取POST有两个主要函数&#xff0c;Get_post()和Get_Posts()。一个是获取单文章&#xff0c;另外一个是获取多文章&#xff0c;其中&#xff0c;官网对Get_posts()函数的描述很简单。但有的时候描述越简单的函数&#xff0c;使用起来却并没有那么简单。下面我通过一个案例…

Android Studio 下使用git -- 个人,本地版本控制

第一步&#xff1a;下载安装git 下载地址 : https://git-scm.com/downloads 第二步&#xff1a;Android Studio 下配置git路径。 配置之后&#xff0c;Test弹出如下成功的提示即可。 第三步&#xff1a;创建版本库 选择项目的根目录比较适合。 第四步&#xff1a;添加需要版本控…

vba中取小数点后两位数,如何快速提取Excel小数点后第N位数字,excle提取小数的个位数...

excel vba中如何获取一个小数的小数点后的位数?用函数行不&#xff1f;FIND RIGHT等函数EXCEL提取小数点&#xff0c;后第一位函数RIGHT(INT(A1*10))EXCEL 函数 分别提取小数后两位right()EXCEL 一组数据里如何将十位数、个位数和小数点提取出来利用MOD函数即可。如下图&#…

oracle数据库延迟执行,如何诊断oracle数据库运行缓慢或hang住的问题

为了诊断oracle运行缓慢的问题首先要决定收集哪些诊断信息,可以采取下面的诊断方法:1.数据库运行缓慢这个问题是常见还是在特定时间出现如果数据库运行缓慢是一个常见的问题那么可以在问题出现的时候收集这个时期的awr或者statspack报告(通常收集时间间隔是一个小时).生成awr报…

The Everyman's Guide to How Network Packets Are Routed Across the Web

转自&#xff1a; http://null-byte.wonderhowto.com/how-to/hacker-fundamentals-everymans-guide-network-packets-are-routed-across-web-0134491/ We already covered how your data travels the OSI model, layer by layer, and talks with other machines on your local …