设计模式

来源:互联网 发布:淘宝购物车怎么置顶 编辑:程序博客网 时间:2024/06/05 22:59

1、多态的简单简单事例:

abstract class Tiger() {public abstract function climb();}class XTiger extends Tiger {public function climb() {echo "摔下来";}}class MTiger extends Tiger {public function climb() {echo "爬到树顶";}}class Client {public static function call(Tiger $animal) {$animal->climb();};}Client::call(new XTiger());Client::call(new MTiger());


2、面向接口简单事例:

interface:面向对象编程语言中接口操作的关键字,功能是把所需成员组合起来,用来一定功能的集合。

//共同接口interface db {function conn();}//服务端开发(不知道将会被谁调用)class dbmysql implements db{public function conn() {echo "连上MySQL";}}class dbsqlite implements db{public function conn() {echo "连接上sqlite";}}//==客户端看不见dbmysql,dbsqlite的内部细节的//只知道,上俩个类实现了db接口$db = new dbmysql();$db->conn();


3、简单工厂模式简单事例:

//共同接口interface db {function conn();}//服务端开发(不知道将会被谁调用)class dbmysql {public function conn() {echo "连上MySQL";}}class dbsqlite {public function conn() {echo "连接上sqlite";}}class Factory {public static function createDB($type) {if ($type == "mysql") {return new dbmysql();} else if($type == "sqlite") {     return new dbsqlite();} else {throw new Exception("Error db type", 1);}}}//==客户端现在不知道服务器有哪些类名//==只知道对方开放了一个Factory::createDB方法//方法允许传递数据库名$mysql = Factory::createDB("sqlite");$mysql->conn();

工厂与简单工厂相比较:更好、简单添加一个类型



4、工厂方法简单事例:

//共同接口interface db {function conn();}interface Factory {function createDB();}//服务端开发(不知道将会被谁调用)class dbmysql {public function conn() {echo "连上MySQL";}}class dbsqlite {public function conn() {echo "连接上sqlite";}}class mysqlFactory implements Factory {public function createDB() {return new dbmysql();}}class sqliteFactory implements Factory {public function createDB() {return new dbsqlite();}}//新增一个oracle类class dboracle {public function conn() {echo "连接上oracle";}}class oracleFactory implements Factory {public function createDB() {return new dboracle();}}//==客户端开始==$fact = new mysqlFactory();$mysql = $fact->createDB();$mysql->conn();



5、单例模式简单事例:

实现单例模式的思路:首先防止外部new操作,内部开放一个公共的接口提供new操作,最后是防止被覆盖和封锁克隆

class sigle {protected static $ins = null;public static function getIns() {if (self::$ins === null) {self::$ins = new self();}return self::$ins;} //方法前加final,则方法不能被覆盖;类前加final,则类不能被继承final protected function __construct() {}//封锁clonefinal protected function __clone() {}}$s1 = sigle::getIns();$s2 = sigle::getIns();if ($s1 === $s2) {echo "相等";} else {echo "不相等";}

6、观察者模式简单事例:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>观察者模式</title><style>div {margin: 10px;width: 500px;height: 200px;border: 1px solid green;}</style></head><body><h1>用观察者模式来切换</h1><select name="" id=""><option value="male">男士风格</option><option value="female">女士风格</option></select><input type="button" value="观察学习" onclick="t1()"><input type="button" value="不观察学习" onclick="t2()"><div id="content">我是内容</div><div id="ad">我是广告</div><div id="study">学习</div></body><script>var sel = document.getElementsByTagName("select")[0]; sel.observers = {};sel.attach = function(key,obj) {this.observers[key] = obj;}sel.detach = function(key) {delete this.observers[key];}//当下拉框改变时,触发事件sel.onchange = sel.notify = function() {for(var key in this.observers) {this.observers[key].update(this);}}//客户端var content = document.getElementById('content');var ad = document.getElementById('ad');content.update = function(observee) {if (observee.value == "male") {this.style.backgroundColor = "gray";} else if(observee.value == "female") {this.style.backgroundColor = "pink";}}ad.update = function(observee) {if (observee.value == "male") {this.innerHTML = "汽车";} else if(observee.value == "female") {this.innerHTML = "减肥";}}var study = document.getElementById('study');study.update = function(observee) {if (observee.value == "male") {this.innerHTML = "学习计算机";} else if(observee.value == "female") {this.innerHTML = "学习美容";}}function t1() {sel.attach('study',study);}function t2() {sel.detach('study');}//监听select的变化sel.attach('content',content);sel.attach('ad',ad);</script></html>






0 0
原创粉丝点击