设计模式

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() {

	}

	//封锁clone
	final 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="观察学习" οnclick="t1()">
	<input type="button" value="不观察学习" οnclick="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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值