OCP(开放-封闭原则)

刚刚看了《敏捷软件开发-原则、模式与实践》第九章 OCP
定义:软件实体(class、moudle、function等等)应该是可以扩展的,但是不可修改的。
优点:减少耦合,避免在迭代式的更新中面对不断修补的局面
使用:DP中的策略模式
有两个主要特征:
对于扩展是开放的
对于更改是封闭的
大概的意思是我们可以改变模块的功能,但是不必改动之前的源代码。
就是说,在设计之前如果做好OCP的话,在以后的迭代式更新的时候就减少修改源代码的可能。使用抽象父类或者接口类可以提前约定好类的作用,在以后的修改中可以继承之前写好的父类。
说下DP的策略模式,策略模式是定义一组算法的接口,在使用时根据不同的场景来实例化不同的算法以达到OCP的目的。
详细代码如下
实现一个打折的功能吧:
//首先定义人行走的
abstract class Walk
{
public function walkHandler();
}
//实现用自行车行走的算法
class Bike extends walk
{
public function walkHandler()
{
echo '用自行车走';
}
}
//实现用小轿车走的算法
class Car extends walk {
public function walkHandler()
{
echo '用轿车走';
}
}
//显示人走方式的class
class PeopleWalk
{
//存放Walk子类实例的对象
private $walk;
//必须用Walk限制输入参数为Walk类
public function mode(Walk $walk)
{
$this->walk = $walk;
}
//调用Walk子类的handler方法实现行走
public function walk()
{
$this->walk->walkHandle();
}
}
//实例化人行走的类
$peopleWalk = new PeopleWalk();
//调用mode方法以传入Walk类的子类
$peopleWalk->mode(new Car());
//行走
$peopleWalk->walk();

上面的代码就是使用了DP的策略模式,也是对OCP的使用。这样的定义了一个抽象父类之后,如果以后需要对行走方式的扩展(例如飞机、船)就可以通过继承该父类的方式进行,而PeopleWalk类不需要知道自己的walk方法到底调用了什么东西,只要在walk方法之前调用了mode方法就可以使用了。如果在walk方法之前没有调用mode方法,那么会报错,这就增加了一定的复杂性,目前想到两种方式,一是使用构造函数传入参数(这样可能会造成传入的参数不一定会被使用),二是在walk方法里面检查$walk对象有没有值,如果没有值可以设置一个默认值。
OCP 真的很好用和单一职责放在一起真的是绝配。

转载于:https://www.cnblogs.com/zzx11235/articles/4634114.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值