设计模式基本原则
MVC的特点是:通过视图和模型之间建立订阅/通知协议,实现视图和模型的解耦。从MVC开始讨论设计模式中的各种工具,应为大多数设计模式都是与MVC有关的,只有某些部分是与MVC没关。
- 第一个设计模式原则:按接口而不是实现进行编程
对象使用他的接口或者抽象类进行引用,而不是使用对象的具体类进行引用。按接口编程可以将设计与实现进行解耦。只要保证接口的参数和返回值不变,他的内容任意发生改动也不会对其他程序造成影响。在java这类强类型语言中,申明一个变量时,指定其数据类型为需要实例化的对象的抽象/接口类。PHP不能声明变量的同时指定数据类型,可以通过在函数中指定能够接收的参数类型实现。
IVehicle.php
<?php
interface IVehicle
{
public function running();
public function ride();
}
Car.php
<?php
include_once 'IVehicle.php';
class Car implements IVehicle
{
public function running(){
return "轿车能在快速车道道跑,最高时速120km/h\n";
}
public function ride(){
return "轿车能载5个人\n";
}
}
Bus.php
<?php
include_once 'IVehicle.php';
class Bus implements IVehicle
{
public function running(){
return "公交车只能在大客车道跑,最高时速90km/h\n";
}
public function ride(){
return "公交车能乘坐40人\n";
}
}
TrafficBrief.php
<?php
include_once "Car.php";
include_once "Bus.php";
include_once "IVehicle.php";
class TrafficBrief
{
public function brief(IVehicle $vehicle){
echo $vehicle->ride();
echo $vehicle->running();
}
}
$one = new TrafficBrief();
$one->brief(new Car());
echo "-------------------------\n";
$one->brief(new Bus());
- 第二个设计模式原则:应当优先选择对象组合而不是类继承
子类过度继续,从父类得到了大量的方法和属性,变得臃肿。如果我们需要修改父类,需要同时维护继承该父类的子类,也有可能修改父类后会导致子类出现异常。
IS-A 与 HAS-A的差别
IS-A:在继承关系中,子类属于父类的一部分,相比父类更加具体。
HAS-A:在组合中,某个类包含了一个或多个不同的类,这个类向那些被包含的类分派任务(委托),使用它们的方法完成一系列操作。
设计模式分类
- 创建性
对象的创建进行封装。一个复杂的对象,他的创建可能需要依赖于其他对象(组合)、配置文件、环境等。对对象的创建进行封装,能隐藏这些细节,简单的创建出对象。 - 结构性
有组织的结合对象或类
结构性类模式:采用继承组织接口和实现。
结构性对象模式:通过对象组合方式,创造出新功能。 - 行为性
解决的问题是算法和对象之间责任的分配
如何选择设计模式
在选择设计模式时,需要考虑,具体业务那些部分会发生改变,导致需要重新进行程序设计。
下表展示了常用设计模式,哪些部分改变后不会导致重新设计
作用 | 范围 | 模式 | 可变化的部分 |
---|---|---|---|
创建型 | 类 | 工厂方法 | 实例化对象的子类 |
对象 | 原型 | 实例化对象的类 | |
结构型 | 类 | 适配器 | 对象的接口 |
对象 | 适配器 | 对象职责而不派生子类 | |
行为型 | 类 | 模板方法 | 算法中的步骤 |
对象 | 状态 | 对象状态 | |
对象 | 策略 | 算法 | |
对象 | 责任链 | 可以满足请求的对象 | |
对象 | 观察者 | 依赖于其他对象的对象数,当前可以有多少个依赖对象 |
框架与设计模式的区别
框架具有指示性,可以清晰的指示解决一个问题的结构。框架是比设计模式更加具体,应用采用某个框架,就会受这个框架限制,但是应用构建起了简单。