php interface接口 生产者模式 工厂模式 适配器模式 观察者模式 理解 + 代码
开讲之前先了解理论知识,要不然会一脸懵B
花了近1天的时间去了解一下这些模式, 其实生活中还挺常见的
interface 接口
使用interface接口 可以指定那些类必须实现这些方法 方法必须为公共的(public)
需要注意的是
1.这些方法的主体必须是空的,
2.并且接口不能被实例化
3.一个类可以使用多个接口, 用逗号隔开
4.类必须要实现接口的所有方法
5.接口的属性必须是常量 这就是接口的特性
优点
定义规范保证了统一性
接口代码
<?php
//定义接口
interface demo{
public const test = '自由网';
public function connect();
}
interface demo2{
public const test2 = '接口2';
public function connect2();
}
//实现接口
class free implements demo{
public function connect(){
}
}
//多个接口
//实现接口
class free1 implements demo,demo2{
public function connect(){
echo "这是第一个接口";
}
public function connect2(){
echo "die 2 个接口";
}
}
?>
生产者模式
生产者->缓存区->消费者
理解 : 比较抽象 就拿 快递员来理解这个生产者,模式
- 你需要寄一个快递 ---------------------这个就是生产者
- 此时你把快递给快递公司 ------------这个就是缓冲区
- 快递公司将快递运到目的地取出 —消费者取出数据
- 快递员吧快递送给对方 ---------------消费者处理数据
优点
1.解耦 打个比方 生产者 直接调用消费者 那么这样会造成依赖,一旦生产者代码改变,这会影响到消费者 如果把 生产者 和 消费者 放入缓冲区 ,依赖缓冲区 , 这样两者之间不会产生依赖 耦合也降低了
2.支持并发 如果没有缓冲区 那 生产者产生数据完毕之后, 只能等待消费者来了以后才能消费, 如果中间有个寄存的地方(缓冲区) 生产者可以把数据放到缓冲区 , 离开 等消费者来了之后自己取
工厂模式
工厂模式就是一种常用的实列化, 用工厂模式代替传统的new 因为工厂模式就相当于创建实例对象的new 用工厂模式会给你系统带来更大的可扩展性和尽量少的修改量
代码
<?php
interface abstracted{
public function realCreate();
}
//女人类
class Woman{
public function action(){
echo '这是女人';
}
}
//男人类
class Man{
public function action(){
echo '这是男人';
}
}
//创建女人
class WomanCreator implements abstracted {
public $chromosome;//染色体
public function realCreate(){
if ($this->chromosome == "xx") {
return new Woman();
}
}
}
//创建男人
class ManCreator implements abstracted {
public $chromosome;
public function realCreate(){
if ($this->chromosome == "xy" || $this->chromosome == "xyy") {
return new Man();
}
}
}
//人类工厂
class PersonFactory{
public function create($what){
$create = $what."Creator";
return $create = new $create();
}
}
$create = new PersonFactory();
$instance = $create->create('Woman');
$instance->chromosome = "xx";
$instance->realCreate()->action();
?>
适配器模式
理解 :
以前有个老的接口 ,现在不能使用了 但是公司还是需要这个接口, 那中间转换一下 能让接口继续 使用 这个就是适配器 打个比方 你要去国外旅游, 到了国外发现充电器插座是3插的, 但你的是国内二插的, 这个时候你需要买一个转接器, 这个转接器就 相当于适配器
适用场景
1,系统需要使用某些类,此时这个类却不兼容。
2,需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。
3,需要一个统一的输出接口,但是输入类型却不可预知。
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作
类适配器
<?php
//目标角色 需要得到的类,Source通过适配得到的类对象,也就是我们期待得到的借口
interface Target {
public function DC5();
}
//源角色 需要被适配的类、接口、对象,即Datas。
class Adaptee {
public function DC220V(){
return 225;
}
}
//类适配器角色 适配器类,协调Source和Destination,使两者能够协同工作。
class Adapter extends Adaptee implements Target {
public function DC5(){
$DC220V = $this->DC220V();
echo $DC220V / 44;
}
}
//客户端
class Client {
public static function main() {
$adapter = new Adapter();
$adapter->DC5(); //5V电压
}
}
echo Client::main();
?>
//对象适配器模式
<?php
//目标角色
interface Target {
public function api1();
public function api2();
}
//源角色
class Adaptee {
public function api1(){
echo 'Adapter 角色1'."<br>";
}
}
//类适配器角色
class Adapter implements Target {
private $adaptee;
function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
//委派调用Adaptee的api1方法
public function api1(){
echo $this->adaptee->api1();
}
public function api2(){
echo 'Adapter 角色2'."<br>";
}
}
//客户端
class Client {
public static function main() {
$adapter = new Adapter(new Adaptee());
$adapter->api1();
$adapter->api2();
}
}
Client::main();
?>
观察者模式
观察者模式:对象之间多对一依赖的一种设计模式,被依赖的对象称为subject,依赖的对象为observer,subject发生变化时通知observer对象 观察者模式属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
以天气的情景做例子:第三方天气软件从气象站获取最新的温度,湿度和气压,当气象站温度,湿度和气压变化时,第三方天气软件要做到及时的更新 ,当天气数据变化时,对第三方软件一一进行通知
代码
基于库操作
(PHP 5 >= 5.3.0, PHP 7)
SPL ( Standard PHP Library ) PHP库 用库构建观察者模式非常简单
SplObjectStorage :: addAll - 添加来自另一个存储的所有对象
SplObjectStorage :: attach - 在存储中添加一个对象
SplObjectStorage :: contains - 检查存储是否包含特定对象
SplObjectStorage :: count - 返回存储中的对象数
SplObjectStorage :: current - 返回当前存储条目
SplObjectStorage :: detach - 从存储中删除对象
SplObjectStorage :: getHash - 计算包含对象的唯一标识符
SplObjectStorage :: getInfo - 返回与当前迭代器条目关联的数据
SplObjectStorage :: key - 返回迭代器当前所在的索引
SplObjectStorage :: next - 移至下一个条目
SplObjectStorage :: offsetExists - 检查存储中是否存在对象
SplObjectStorage :: offsetGet - 返回与对象关联的数据
SplObjectStorage :: offsetSet - 将数据关联到存储中的对象
SplObjectStorage :: offsetUnset - 从存储中删除对象
SplObjectStorage :: removeAll - 从当前存储中删除另一个存储中包含的对象
SplObjectStorage :: removeAllExcept - 从当前存储中删除除包含在另一个存储中的对象之外的所有对象
SplObjectStorage :: rewind - 将迭代器倒回到第一个存储元素
SplObjectStorage :: serialize - 序列化存储
SplObjectStorage :: setInfo - 设置与当前迭代器条目关联的数据
SplObjectStorage :: unserialize - 从其字符串表示形式反序列化存储
SplObjectStorage :: valid - 返回当前迭代器条目是否有效
<?php
/**
*
*/
class Article
{
protected $observers = null;
function __construct()
{
$this->observers = new SplObjectStorage(); //实例化对象
}
//绑定观察和
public function attach(Spl $observer){
$this->observers->attach($observer);
}
// 解绑 观察者
public function detach(Spl $observer){
$this->observers->detach($observer);
}
//发送通知
public function notify(){
//将迭代器倒回到第一个存储元素
$this->observers->rewind();
foreach ($this->observers as $observer) {
$observer->update();
}
}
}
interface Spl{
public function update();
}
class A1 implements Spl{
public function update(){
echo "更新通知1";
}
}
class A2 implements Spl{
public function update(){
echo "更新通知2";
}
}
/
$Article = new Article();
$Article->attach(new A1());
$Article->attach(new A2());
$Article->notify();
?>
原生观察者
<?php
// 主题接口
interface Subject
{
public function register(Observer $observer);
public function notify();
}
// 观察者接口
interface Observer{
public function watch();
}
// 主题
class Action implements Subject{
public $_observers=array();
public function register(Observer $observer){
$this->_observers[]=$observer;
}
public function notify(){
foreach ($this->_observers as $observer) {
$observer->watch();
}
}
}
// 观察者
class Cat implements Observer{
public function watch(){
echo "Cat watches TV<hr/>";
}
}
class Dog implements Observer{
public function watch(){
echo "Dog watches TV<hr/>";
}
}
class People implements Observer{
public function watch(){
echo "People watches TV<hr/>";
}
}
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();
?>