Skip to content

Latest commit

 

History

History
253 lines (210 loc) · 5.08 KB

设计模式.md

File metadata and controls

253 lines (210 loc) · 5.08 KB

##设计模式##

###三大类(23种模式) ####1. 创建型的类: #####工厂模式 Factory

<?php
    //通过你这个加工厂, 你就帮我返回 实例化这个类
    //instance 实例

    class Factory{
        //需要实例化的类名称
        public function getIns($name){
            //require() 判断文件是否存在 引入文件

            //可变类
            $ins = new $name();
            //返回实例化后得到的对象''
            return $ins;
        }
    }

    //得到一个A类的对象
    var_dump(Factory::getInt("A"));
    //得到一个B类的对象
    var_dump(Factory::getInt("B"));
    //得到一个A类的对象
    var_dump(Factory::getInt("A"));
?>

######例子 计算机

<?php
	//计算机抽象类
	abstract class Jisuan{
		abstract public function getVlue($num1, $num2);
    }

	//加法类
	class Numadd extends Jisuan{
    	public function getVlue($num1, $num2){
        	return $num1 + $num2;
        }
    }

	//减法类
	class NumSub extends Jisuan{
    	public function getVlue($num1, $num2){
        	return $num1 - $num2;
        }
    }

    //乘法类
	class NumMul extends Jisuan{
    	public function getVlue($num1, $num2){
        	return $num1 * $num2;
        }
    }

	//除法类
	class NumDiv extends Jisuan{
    	public function getVlue($num1, $num2){
        	if($num2 != 0){
            	return $num1 / $num2;
            }
        }
    }

    //工厂---->按照我要的操作, 返回两个数的运算结果
    class Fatory{
    	//$re + - * /  我具体要实现的操作
    	public function getNum($rs){
        	switch($rs){
            	case "+":
                	return new Numadd();
                    break;
                case "-":
                	return new NumSub();
                    break;
                case "*":
                	return new NumMul();
                    break;
                case "/":
                	return new NumDiv();
                    break;
            }
        }
    }

    var_dump(Fatory::getNum('+')->getVlue(1,2));
?>

#####单例模式

<?php
	//单例模式 只能得到一个对象
	class Single{
    	//属性 只能是一个确切的值, 不能是一个运算结果
		private $rand;

		private $ins = null;

		//私有化构造方法  不允许从外部new 对象
        private function __construct(){
        	$this->rand = rand(0, 999);
        }

        //私有化克隆方法  不允许外部克隆实例
        private function __clone(){}

		//创建一个静态的公开方法 getIns  返回一个对象实例
        static public function getIns(){
        	//判断是否第一次调用 getIns
            if(self::$ins === null){
            	self::$ins = new self();
            }
        	return self::$ins;
        }
    }

    $s1 = new Single();
	$s2 = new Single();

	var_dump($s1);
    var_dump($s2);

?>

######数据库 例子

<?php
	class nConn{
    	private static $ins = null;

        private $conn;

        private function __construct(){
        	$conn = mysqli_connect('localhost', 'root', '123456', 'test');
        }

        private function __clone(){}

        //获取单利模式的对象
        static public function getIns(){
        	if(self::$ins === null){
            	self::$ins =new self();
            }
        	return self::$ins;
        }

    	public function query($sql){
        	return mysqli_query($this->com, $sql);
        }
    }
?>

####2. 结构型的类: #####适配器模式 ######电源接口 例子

<?php
	//电源适配器
    class Waiguo{
    	public function test1(){
        	echo '我是国外的充电接口';
        }
    }

	//设配器
    //1. 容纳国外接口
    //2. 容纳国内接口
	interface Adapter{
    	public function test1();
        public funciton test2();
    }

	class Adapterr implements Adpter{
    	private $_name;

        //传入国外的电源类名称
		public funciton __construct($name){
        	$this->_name = $name;
        }

		public function test1(){
        	//调用 Waiguo类中的test1 方法
        	return $this->_name->test1();
        }

        public funciton test2(){
        	echo '我是国内的充电接口';
        }
    }

    //用户类
    class User{
    	static function UserAdb(){
        	//获得充电适配器的对象
            $user = new Adapterr(new Waiguo());

			//国外的电源对象
			$user->test1();
            $user->test2();
        }
    }

    User::UseAdb();
?>

####3. 行为型的类: #####观察者模式

<?php
    interface Flying{
    	public function fly();
    }

    class FlyBird implements Flying{
    	public function fly(){
        	echo 'i can fly <br>';
        }
    }

    class WarkBird implements Flying{
    	public function fly(){
        	echo 'i can`t fly <br>';
        }
    }

	//把变化的从不变化中抽取出来
    //把fly 写成一个接口
    class Bird{
    	public function fly($objBird){
        	return $objBird->fly();
        }

        public function swim(){
        	echo 'i can swimming <br>';
        }
    }

	$b1 = new Bird();
    $b1->fly(new FlyBird());		//i can fly
?>