1. 程式人生 > >設計模式:介面卡模式和裝飾器模式

設計模式:介面卡模式和裝飾器模式

package study.design.adapter.pass;

import study.design.adapter.ResultMsg;


/**
 * @comment 原介面
 * @author bin
 * @date 2018年8月2日 
 */
public interface SignService{
	
	public ResultMsg signIn(String userName,String passWord) ;
	
	public ResultMsg signUp(String userName,String passWord) ;
}
package study.design.adapter.pass;

import study.design.adapter.ResultMsg;
/**
 * 
 * @comment 原方法 
 * @author bin
 * @date 2018年8月2日
 */
public class SignServiceImpl implements SignService{
	
	@Override
	public ResultMsg signUp(String userName, String passWord) {
		return new ResultMsg(200, userName, "註冊成功");
	}
	
	@Override
	public ResultMsg signIn(String userName, String passWord) {
		return new ResultMsg(200, userName, "登入成功");
	}

}
package study.design.adapter.pass;

import study.design.adapter.ResultMsg;

/**
 * @comment 第三方登入實現服務
 * @author bin
 * @date 2018年8月2日 
 */
public class ThridSignServiceImpl extends SignServiceImpl{

	@Override
	public ResultMsg signUp(String userName, String passWord) {
		// TODO Auto-generated method stub
		return super.signUp(userName, passWord);
	}

	@Override
	public ResultMsg signIn(String userName, String passWord) {
		// TODO Auto-generated method stub
		return super.signIn(userName, passWord);
	}
	/*
	 * 新增QQ登入
	 */
	public ResultMsg QQSignIn(String userName) {
		
		return new ResultMsg(200,userName,"QQ登入成功");
	}
}
package study.design.adapter.pass;


/**
 * 介面卡模式
 * @comment
 * 需求:在不改變原有登入註冊等業務場景下 新增第三方登入 
 * 理解:在未改動原有服務實現的情況下 增加新的方法
 * 實現方式:繼承原有服務 新增方法
 * @author bin
 * @date 2018年8月2日 
 */
public class ThirdSignTest {
	
	public static void main(String[] args) {
		//原註冊登入的方式
		SignService sign=new SignServiceImpl();
		String userName="使用者名稱";
		String passWord="密碼";
		sign.signIn(userName, passWord);
		sign.signUp(userName, passWord);
		//擴充套件第三方登入後方式
		ThridSignServiceImpl thrdSign = new ThridSignServiceImpl();
		thrdSign.signIn(userName, passWord);//原登入方法還可以使用
		thrdSign.signUp(userName, passWord);//原註冊方法還可以使用
		thrdSign.QQSignIn(userName);//新增的QQ登入
		
		
	}
}
package study.design.decorator.pass;

import study.design.adapter.ResultMsg;

/**
 * @comment 第三方登入實現服務
 * @author bin
 * @date 2018年8月2日 
 */
public class ThridSignServiceImpl implements ThridSignService{

	SignService signService;
	
	public ThridSignServiceImpl(SignService signService) {
		this.signService=signService;
	}
	
	@Override
	public ResultMsg signIn(String userName, String passWord) {
		// TODO Auto-generated method stub
		return signService.signIn(userName, passWord);
	}

	@Override
	public ResultMsg signUp(String userName, String passWord) {
		// TODO Auto-generated method stub
		return signService.signUp(userName, passWord);
	}
	@Override
	public ResultMsg QQSignIn(String userName) {
		return new ResultMsg(200,userName,"QQ登入成功");
	}

}

            ===============================================================------
            裝飾器模式                          |   介面卡模式
            -----------------------------------+---------------------------------
            是一種非常特別的介面卡模式            |  可以不保留層級關係
            -----------------------------------+---------------------------------
            裝飾者和被裝飾者都要實現同一個介面     |  適配者和被適配者沒有必然的層級聯絡
            主要目的是為了擴充套件,依舊保留OOP關係    |  通常採用代理或者繼承形式進行包裝
            -----------------------------------+----------------------------------
            滿足is-a的關係                      |   滿足has-a
            -----------------------------------+----------------------------------
            注重的是覆蓋、擴充套件                   |   注重相容、轉換
            -----------------------------------+----------------------------------
介面卡實現方式:繼承該類並擴充套件即可

裝飾器模式:實現介面,並在定義的裝飾器中宣告介面並定義引數為介面的構造方法