也稱爲橋樑模式、接口模式或柄體模式, 是講抽象部分與它的實現部分分離, 使它們均可以獨立地變化
特徵: 經過組合的方式創建兩個類之間的聯繫, 而不是繼承; 屬於結構型模式數據庫
適用場景:
一、 在抽象和具體實現之間須要增長更多的靈活性的場景
二、一個類存在兩個(或多個)獨立變化的維度, 而這兩個(或多個)維度都須要獨立進行擴展
三、不但願適用繼承,或由於多層繼承致使系統類的個數劇增ide
public interface ICourse {
}
public interface INote { void edit(); }
public interface IVideo {
}
public class AbstractCourse implements ICourse{ private INote note; private IVideo video; public void setNote(INote note) { this.note = note; } public void setVideo(IVideo video) { this.video = video; } @Override public String toString() { return "AbstractCourse{" + "note=" + note + ", video=" + video + '}'; } }
public class JavaCourse extends AbstractCourse{ }
public class JavaNote implements INote{ @Override public void edit() { } }
public class JavaVideo implements IVideo{ }
public class PythonCourse extends AbstractCourse{ }
public class PythonNote implements INote{ @Override public void edit() { } }
public class PythonVideo implements IVideo{ }
======================================================================================this
public interface IMessage { /** * 發送消息的內容和接收人 * @param message * @param toUser */ void send(String message, String toUser); }
public class EmailMessage implements IMessage{ @Override public void send(String message, String toUser) { System.out.println("使用郵件消息發送" + message + "給" + toUser); } }
public class SmsMessage implements IMessage{ @Override public void send(String message, String toUser) { System.out.println("使用短信消息發送" + message + "給" + toUser); } }
public abstract class AbstractMessage { private IMessage message; public AbstractMessage(IMessage message) { this.message = message; } void sendMessage(String message, String toUser){ this.message.send(message, toUser); } }
public class NomalMessage extends AbstractMessage{ public NomalMessage(IMessage message) { super(message); } }
public class UrgencyMessage extends AbstractMessage{ public UrgencyMessage(IMessage message) { super(message); } @Override void sendMessage(String message, String toUser){ message = "【加急】" + message; super.sendMessage(message,toUser); } public Object watch(String messageId){ return null; } }
public static void main(String[] args) { IMessage message = new SmsMessage(); AbstractMessage abstractMessage = new NomalMessage(message); abstractMessage.sendMessage("調休申請","李總"); message = new EmailMessage(); abstractMessage = new UrgencyMessage(message); abstractMessage.sendMessage("調休申請","李總"); }
優勢:
1、分離抽象部分及其具體實現部分
2、提升了系統的擴展性
3、符合開閉原則
4、符合合成複用原則
缺點;
1、增長了系統的理解和設計難度
2、須要正確地識別系統中兩個獨立變化的維度
源碼中的運用: Java代碼操做MySQL數據庫, 經過 DriverManagerspa