<?php
interface process
{
public function process();
}
class playerencode implements process
{
public function process()
{
echo 'encode';
}
}
class playeroutput implements process
{
public function process()
{
echo 'out put';
}
}
class playProcess
{
private $message = null;
public function callback(event $event)
{
$this->message = $event->click();
if ($this->message instanceof process) {
$this->message->process();
}
}
}
class mp4
{
public function work()
{
$playProcess = new playProcess();
$playProcess->callback(new event('encode'));
$playProcess->callback(new event('output'));
}
}
class event
{
private $m;
public function __construct($me)
{
$this->m = $me;
}
public function click()
{
switch ($this->m)
{
case 'encode':
return new playerencode();
break;
case 'output' :
return new playeroutput();
break;
}
}
}
$mp4 = new mp4();
$mp4->work();
1.面向对象设计的五大原则
1.单一职责原则(Single Pesponsibility Principle, SRP)
职责,变化的原因。也就是说,就一个类而言,应该只有一个引起它变化的原因。
单一职责有2个含义:
1.避免相同的职责分散到不同的类中
2.避免一个类承担太多的职责
为什么要遵守SRP呢?
1.减少类之间的耦合
2.提高类的复用性
2.接口隔离原则
接口污染:为接口添加不必要的职责。接口隔离其他就是定制化服务设计的原则。可以考虑如下2个方法:
1.利用委托分离接口
2.利用多继承分离接口
3.开闭原则
基本思想:
1.open : 模块的行为必须是开放的,支持扩展的,而不是僵化的
2.close : 在对模块的功能进行扩展时,不应该影响或大规模的影响已有的程序模块
要求开发人员在不修改系统中现有的功能代码的前提下,实现对应用程序系统的软件功能的扩展。一个模块在扩展性方面应该是开放的,
而在更改性方面是封闭的。
如何遵守开放-封闭原则:
实现开放-封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,这样的修改就是封闭的;而通过
面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆盖写其方法来改变固有的行为,实现新的扩展方法,所以对于扩展就是开放的。
1.在设计方面充分应用 '抽象' 和 '封装' 的思想
一方面也就是要在软件系统中找出各种可能的 '可变因素' ,并将之封装起来。
另外一个方面,一种可变因素不应当散落在多个不同代码模块中,而应当被封装到一个对象中。
2.在系统功能编程实现方面应用面向接口的编程
当需求发生变化时,可以提供提接口新的实现类,以求适应变化。
面向接口编程要求功能类实现接口,对象声明为接口类型。
4.里式替换原则
子类必须能够替换成它们的基类。
由于面向对象中编程技术中的继承在具体的编程中过于简单,在许多系统的设计和编程实现中,我们并没有认真的,理性的思考应用系统
中各个类之间的继承关系是否合适,派生类是否能正确的对其基类中的某些方法进行重写等问题。因此继承出现滥用继承或者错误的进行了
继承等现象,给系统的后期维护带来不少麻烦。
LSP 指出:子类型必须能够替换掉它们的父类型,并出现在父类能够出现的任何地方。它指到我们如何正确的进行继承与派生,而且这根本
不可能察觉出基类对象和子类对象的区别。
LSP 主要是针对继承的设计原则。
如何遵守设计原则呢?
1.父类的方法都要在子类中实现后者重写,并且派生类只能实现其抽象类中声明的方法,而不应该给出多余的方法定义或实现。
2.在客户端程序中应该使用父类对象而不应该直接使用子类对象,这样可以实现运行期绑定(动态多态)
如果A,B 两个类违反了 LSP 的设计,通常的做法是创建一个新的抽象类C,作为2个具体类的超类,将A和 B的共同行为移到C中,从而解决A和 B
行为完全不一致的问题。
5.依赖倒置原则
将依赖关系倒置为依赖接口。具体概念如下:
1.上层模块不应该依赖下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)
2.抽象类不能依赖具体类,具体应该要依赖于抽象
为什么要依赖接口?因为接口体现对问题的抽象,同时由于抽象一般是相对稳定的或者是相对变化不频繁的,而具体是易变的。因此,
依赖抽象是实现代码扩展和运行期内绑定(多态)的基础:只要实现了该抽象类的子类,都可以被类的使用者使用。
1.面向对象思想的设计原则