PHP设计模式一
多态
父类A,被子类B\C继承,D类中传入子类的父类,调用该类的统一方法。
class ABase{ protected $name ="ABase"; public functiontest(){echo"test ".$this->name." \n"; }}class B extends ABase{ public function__construct(){$this->name="B"; }}class C extends ABase{ public function__construct(){$this->name="C"; }}class D{ public functiontest(ABase a){ a->test(); }}$d = new D();$d->test(new B());$d->test(new C());输出test Btest C
php 是弱语言, 传入的数据类型不受限制,不包括严格校验模式。
比如D::test()参数不是ABase类也不会报错,但若是传入的类不符合a->test(),没有对应方法或需传入参数,程序会报错。
说明多态情况,意在表明弱语言和强语言的不同。
弱语言不适用所有设计模式。
1 工厂模式
简单工厂
interfacedb{ publilc functionconn(){}}classMysqlDbimplementsdb{ publilc functionconn(){return$this; }}classPostgreSqlDbimplementsdb{ publilc functionconn(){return$this; }}classFactory{publicfunctiongetConn($dbname){switch($dbname){case"mysql":returnnew MysqlDb()->conn();case"postgresql":returnnew PostgreSqlDb()->conn();default:new \Exception("db name error"); } }}
使用
$factory = new Factory();$mysql = $factory->getConn("mysql");
核心思想,封装底层方法,使底层逻辑和业务逻辑分离。
客户端/逻辑层通过调用少量代码实现需求。
面向对象开闭原则:对于修改封闭,对于扩展开放。
优化工厂
以上方法并不符合面向对象开闭原则,可以再改进优化。
interfacedb{ publilc functionconn(){}}interfaceFactory{ publilc functiongetConn(){}}classMysqlDbimplementsdb{ publilc functionconn(){return$this; }}classPostgreSqlDbimplementsdb{ publilc functionconn(){return$this; }}classMysqlFactoryimplements{publicfunctiongetConn(){returnnew MysqlDb(); }}classPostgreSqlFactoryimplements{publicfunctiongetConn(){returnnew PostgreSqlDb(); }}
使用
$factory = new PostgreSqlFactory();$conn = $factory->getConn();
总结
后者相比于前者相同点:底层逻辑修改封闭,即修改封闭。
后者相比于前者优点:调用不同工厂类可新建类,而不用修改已有代码,即扩展开放。
手写代码可能有误,勿复制后直接运行。
B站视频
【PHP架构师学习内容之设计模式】https://www.bilibili.com/video/BV1P441127kP?p=5&vd_source=f1bd3b5218c30adf0a002c8c937e0a27
