柚子快報(bào)激活碼778899分享:Java設(shè)計(jì)模式以及代理模式
柚子快報(bào)激活碼778899分享:Java設(shè)計(jì)模式以及代理模式
一、設(shè)計(jì)模式
1.JAVA六大設(shè)計(jì)原則
JAVA設(shè)計(jì)模式提供六個(gè)基本原則,分別是:
開(kāi)閉原則(OCP) - The Open-Closed Principle單一職責(zé)原則(SRP) - Single Responsibility Principle里氏替換原則(LSP) - Liskov Substitution Principle依賴(lài)倒置原則(DIP) - Dependency Inversion Principle接口隔離原則(ISP) - Interface Segregation Principle迪米特法則(DP) - Demeter Principle
2.JAVA23種設(shè)計(jì)模式
在軟件工程當(dāng)中,設(shè)計(jì)原則和設(shè)計(jì)模式是不同的.
3.設(shè)計(jì)原則
設(shè)計(jì)原則是為了更好的設(shè)計(jì)軟件的高層指導(dǎo)方針.
它不提供具體的實(shí)現(xiàn)方式也不會(huì)綁定任何一種編程語(yǔ)言.
最常用的原則是SOLID(SRP, OCP, LSP, ISP, DIP)原則
4.設(shè)計(jì)模式
設(shè)計(jì)模式對(duì)關(guān)于面向?qū)ο髥?wèn)題的具體解決方案.
比如說(shuō), 如果你想創(chuàng)建一個(gè)類(lèi)而且它在任何時(shí)刻只會(huì)有一個(gè)對(duì)象,那么你就應(yīng)該使用單例類(lèi)模式.
設(shè)計(jì)模式是經(jīng)過(guò)大量檢測(cè)的安全的做法.
4.1 工廠(chǎng)模式(factory)
案例:
INoodles:
package com.ztt.test;
public interface INoodles {
public void noodleType();
}
LanZhouLaMianImp:
package com.ztt.test;
public class LanZhouLaMianImp implements INoodles{
@Override
public void noodleType() {
System.out.println("========來(lái)一碗蘭州拉面========");
}
}
ReGanMianNoodleImp:
package com.ztt.test;
public class ReGanMianNoodleImp implements INoodles{
@Override
public void noodleType() {
System.out.println("========來(lái)一碗武漢熱干面========");
}
}
YouPoMianNoodleImp:
package com.ztt.test;
public class YouPoMianNoodleImp implements INoodles{
@Override
public void noodleType() {
System.out.println("========來(lái)一碗油潑面========");
}
}
NoodleFactory:
package com.ztt.test;
/**
* 面長(zhǎng)
* */
public class NoodleFactory {
/**
* 規(guī)范下面條類(lèi)型
* */
public static final int NOODLE_YOUPO = 1;
public static final int NOODLE_REGAN = 2;
public static final int NOODLE_LANZHOULA = 3;
/**
*創(chuàng)建面條
**/
public static INoodles getNoodle(int type){
if (type == 1){
return new YouPoMianNoodleImp();
}else if(type ==2){
return new ReGanMianNoodleImp();
}else if(type ==3 ){
return new LanZhouLaMianImp();
}
return null;
}
}
package com.ztt.test;
public class Test01 {
public static void main(String[] args) {
NoodleFactory.getNoodle(NoodleFactory.NOODLE_LANZHOULA).noodleType();
NoodleFactory.getNoodle(3).noodleType();
}
}
4.2 單列設(shè)計(jì)模式(singlton)
餓漢式:
package com.ztt.hungrytest;
/**
* 餓漢式
* */
public class Student {
//3.創(chuàng)建static修飾的成員變量
private static Student stu = new Student();
//1.設(shè)計(jì)私有構(gòu)造方法
private Student(){
super();
}
//2.提供共有的方法
public static synchronized Student getInstance(){
return stu;
}
}
package com.ztt.hungrytest;
import com.ztt.lazytest.Student;
public class Test03 {
public static void main(String[] args) {
com.ztt.lazytest.Student stu1 = com.ztt.lazytest.Student.getInstance();
Student stu2 = Student.getInstance();
System.out.println(stu1== stu2);
}
}
懶漢式:
package com.ztt.lazytest;
/**
* 懶漢式
* */
public class Student {
//3.創(chuàng)建static修飾的成員變量
private static Student stu;
//1.設(shè)計(jì)私有構(gòu)造方法
private Student(){
super();
}
//2.提供共有的方法
public static synchronized Student getInstance(){
if(stu == null){
stu = new Student();
}
return stu;
}
}
package com.ztt.lazytest;
public class Test02 {
public static void main(String[] args) {
Student stu1 = Student.getInstance();
Student stu2 = Student.getInstance();
System.out.println(stu1== stu2);
}
}
六、代理模式
1.什么是代理模式?
代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。通俗的來(lái)講代理模式就是我們生活中常見(jiàn)的中介。舉個(gè)例子來(lái)說(shuō)明:假如說(shuō)我現(xiàn)在想買(mǎi)一輛二手車(chē),雖然我可以自己去找車(chē)源,做質(zhì)量檢測(cè)等一系列的車(chē)輛過(guò)戶(hù)流程,但是這確實(shí)太浪費(fèi)我得時(shí)間和精力了。我只是想買(mǎi)一輛車(chē)而已為什么我還要額外做這么多事呢?于是我就通過(guò)中介公司來(lái)買(mǎi)車(chē),他們來(lái)給我找車(chē)源,幫我辦理車(chē)輛過(guò)戶(hù)流程,我只是負(fù)責(zé)選擇自己喜歡的車(chē),然后付錢(qián)就可以了。
2.為什么要用代理模式?
2.1 中介隔離作用:
在某些情況下,一個(gè)客戶(hù)類(lèi)不想或者不能直接引用一個(gè)委托對(duì)象,而代理類(lèi)對(duì)象可以在客戶(hù)類(lèi)和委托對(duì)象之間起到中介的作用,其特征是代理類(lèi)和委托類(lèi)實(shí)現(xiàn)相同的接口。
2.2 開(kāi)閉原則,增加功能:
代理類(lèi)除了是客戶(hù)類(lèi)和委托類(lèi)的中介之外,我們還可以通過(guò)給代理類(lèi)增加額外的功能來(lái)擴(kuò)展委托類(lèi)的功能,這樣做我們只需要修改代理類(lèi)而不需要再修改委托類(lèi),符合代碼設(shè)計(jì)的開(kāi)閉原則。
3.有哪幾種代理模式?
我們有多種不同的方式來(lái)實(shí)現(xiàn)代理。如果按照代理創(chuàng)建的時(shí)期來(lái)進(jìn)行分類(lèi)的話(huà)可以分為兩種:
3.1 靜態(tài)代理:
靜態(tài)代理是由程序員創(chuàng)建或特定工具自動(dòng)生成源代碼,在對(duì)其編譯。
在程序員運(yùn)行之前,代理類(lèi).class文件就已經(jīng)被創(chuàng)建了。
靜態(tài)代理案例:
package com.ztt.statictest;
public interface IWonman {
public void makeEyeWithMan();
}
package com.ztt.statictest;
public class PanJinLianImp implements IWonman{
@Override
public void makeEyeWithMan() {
System.out.println("回眸一笑,拋個(gè)媚眼~");
}
}
package com.ztt.statictest;
//代理
public class WangPoImp implements IWonman{
//被代理對(duì)象
IWonman obj;
public WangPoImp(IWonman obj) {
this.obj = obj;
}
@Override
public void makeEyeWithMan() {
System.out.println("鎮(zhèn)一壺酒,搞搞氣氛~");
obj.makeEyeWithMan();
}
}
package com.ztt.statictest;
public class XiMenQingTest {
public static void main(String[] args) {
//1.創(chuàng)建被代理對(duì)象
IWonman pan = new PanJinLianImp();
//2.創(chuàng)建代理
IWonman wang = new WangPoImp(pan);
wang.makeEyeWithMan();
}
}
3.2 動(dòng)態(tài)代理:
動(dòng)態(tài)代理是在程序運(yùn)行時(shí)通過(guò)反射機(jī)制動(dòng)態(tài)創(chuàng)建的。
動(dòng)態(tài)代理分為:
基于接口的動(dòng)態(tài)代理(jdk自帶)
基于子類(lèi)的動(dòng)態(tài)代理(第三方)
3.2.1 動(dòng)態(tài)代理jdk自帶的案例:
package com.ztt.jdktest;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public interface ISinger {
public void sing();
public int dance(int num);
}
package com.ztt.jdktest;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public class XuezhiqianImp implements ISinger{
@Override
public void sing() {
System.out.println("唱歌");
}
@Override
public int dance(int num) {
System.out.println("跳舞");
return 0;
}
}
package com.ztt.jdktest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public class Test01 {
public static void main(String[] args) {
//1.創(chuàng)建被代理對(duì)象
final ISinger xue = new XuezhiqianImp();
//2.創(chuàng)建代理對(duì)象
ISinger jingJiRen = (ISinger) Proxy.newProxyInstance(xue.getClass().getClassLoader(), xue.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("===做個(gè)自我介紹===");
Object obj = method.invoke(xue,args);
return obj;
}
});
jingJiRen.sing();
//jingJiRen.dance(6);
}
}
3.2.2 動(dòng)態(tài)代理第三方案例:
① 導(dǎo)入坐標(biāo)
② 代碼展示:
package com.ztt.cglibtest;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public interface ISinger {
public void sing();
}
package com.ztt.cglibtest;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public class TengGeErImp implements ISinger{
@Override
public void sing() {
System.out.println("聽(tīng)了趙雷的成都去了成都,聽(tīng)了汪峰的北京去了北京,至今不敢聽(tīng)騰格爾的天堂~");
}
}
package com.ztt.cglibtest;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author 甜甜
* @version 1.0
* @since 2024/8/8
*/
public class Test02 {
public static void main(String[] args) {
//創(chuàng)建被代理對(duì)象
final ISinger teng = new TengGeErImp();
//創(chuàng)建代理對(duì)象
ISinger jing=(ISinger) Enhancer.create(teng.getClass(), teng.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Object object = method.invoke(teng,objects);
return object;
}
});
jing.sing();
}
}
柚子快報(bào)激活碼778899分享:Java設(shè)計(jì)模式以及代理模式
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。