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());
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();
//共同接口
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>