主頁 >  其他 > 設計模式---配接器模式

設計模式---配接器模式

2021-09-02 08:04:56 其他

配接器模式

  • 配接器概念介紹
  • 介紹
  • 角色
  • 作業原理
  • 3種配接器模式
    • 類配接器模式演示
    • 物件配接器模式
      • 物件配接器的優點
    • 介面配接器模式
    • 綜合小案例---使用類配接器模式
      • power--帶轉換的電壓
      • adapter--配接器
      • FindAdapter--尋找合適的配接器
      • 測驗
  • 配接器模式總結
    • 主要優點
    • 主要缺點
    • 適用場景
  • spring MVC中的配接器模式
    • springMVC處理請求流程
    • 請求處理方法中配接器模式部分原始碼探究
    • 總結
  • 參考文章


配接器概念介紹

1、不同國家的插座是有區別的,如果我們去國外旅游,需要帶上國外的插頭轉換器,來能兼容國外的插座;

2、手機的耳機孔有圓頭和扁頭,如果扁頭的耳機孔想接圓頭的耳機就需要一個耳機的轉換器;

在這里插入圖片描述
上述所說的轉換器,其實就是配接器;它是用來做兼容的;


介紹

配接器模式(Adapter Pattern):將一個介面轉換成客戶希望的另一個介面,使介面不兼容的那些類可以一起作業,其別名為包裝器(Wrapper),配接器模式既可以作為類結構型模式,也可以作為物件結構型模式,

在配接器模式中,我們通過增加一個新的配接器類來解決介面不兼容的問題,使得原本沒有任何關系的類可以協同作業,

根據配接器類與適配者類的關系不同,配接器模式可分為物件配接器和類配接器兩種,在物件配接器模式中,配接器與適配者之間是關聯(聚合)關系;在類配接器模式中,配接器與適配者之間是繼承(或實作)關系,


角色

Target(目標抽象類):目標抽象類定義客戶所需介面,可以是一個抽象類或介面,也可以是具體類,

Adapter(配接器類):配接器可以呼叫另一個介面,作為一個轉換器,對Adaptee和Target進行適配,配接器類是配接器模式的核心,在物件配接器中,它通過繼承Target并關聯一個Adaptee物件使二者產生聯系,

Adaptee(適配者類—適配介面):適配者即被適配的角色,它定義了一個已經存在的介面,這個介面需要適配,適配者類一般是一個具體類,包含了客戶希望使用的業務方法,在某些情況下可能沒有適配者類的源代碼,

預設配接器模式(Default Adapter Pattern):當不需要實作一個介面所提供的所有方法時,可先設計一個抽象類實作該介面,并為介面中每個方法提供一個默認實作(空方法),那么該抽象類的子類可以選擇性地覆寫父類的某些方法來實作需求,它適用于不想使用一個介面中的所有方法的情況,又稱為單介面配接器模式,


作業原理

  • 配接器模式:將一個類的介面轉換成另一種介面,讓原本介面不兼容的類可以兼容;
  • 從用戶的角度看不到被適配者;
  • 用戶呼叫配接器轉化出來的目標介面方法,配接器再呼叫被適配者的相關介面方法;

3種配接器模式

  • 類配接器模式
  • 物件配接器模式
  • 介面配接器模式

類配接器模式演示

以生活中充電器為例,充電器本身相當于適配者 (Adapter),220V 交流電相當于被適配者,我們的目標(target) 想把220V交流電轉成5V直流電

要適配的類,即需要將220v電壓轉化為5v電壓

//中國的電壓220V
public class ChinaPower
{
    private final Integer outPut=220;
    public Integer getOutPut() {
        return outPut;
    }
}

配接器介面,只負責定義轉化需要使用的業務邏輯方法,具體實作交由配接器類完成

//將電壓轉化為5v---適配介面
public interface TransTo5V
{
    Integer transTo5V();
}

配接器類,繼承了ChinaPower,并實作了配接器介面,負責實作講220v電壓轉化為5v的具體業務邏輯代碼實作

//配接器類---實作配接器介面
public class ChinaAdapter extends ChinaPower implements TransTo5V
{
    //將220v電壓轉換為5v的
    @Override
    public Integer transTo5V()
    {
        //獲得被適配類,即我們需要將220v電壓轉化為5v回傳
        Integer output=super.getOutPut();
        //進行電壓轉換操作
        return output/44;
    }
}

Phone類,需要用到配接器進行兼容,這樣才可以充電

//手機需要5v的電壓進行充電
public class Phone
{
    //通過配接器獲得5v的電壓
    public void charging(ChinaAdapter chinaAdapter)
    {
        if(5==chinaAdapter.transTo5V())
        {
            System.out.println("得到5v,充電中...");
        }
        else
        {
            System.out.println("電壓過高,手機壓力過大");
        }

    }
}

充電測驗

public class test
{
    @Test
    public void test()
    {
        Phone p=new Phone();
        p.charging(new ChinaAdapter());
    }
}

在這里插入圖片描述


物件配接器模式

還是以上面的例子為例,這一次配接器類不再繼承ChinaPower ,而是以聚合的方式來代替繼承,符合設計模式中的"合成復用原則";java是單繼承機制,這樣可以保留物件繼承權;

我們只需要修改配接器類即可:

//配接器類---實作配接器介面
public class ChinaAdapter implements TransTo5V
{
    private ChinaPower chinaPower;
    //通過構造器,完成賦值
    public ChinaAdapter(ChinaPower chinaPower)
    {
     this.chinaPower=chinaPower;   
    }
    //將220v電壓轉換為5v的
    @Override
    public Integer transTo5V()
    {
        //獲得被適配類,即我們需要將220v電壓轉化為5v回傳
        Integer output=chinaPower.getOutPut();
        //進行電壓轉換操作
        return output/44;
    }
}

測驗

public class test
{
    @Test
    public void test()
    {
        Phone p=new Phone();
        p.charging(new ChinaAdapter(new ChinaPower()));
    }
}

在這里插入圖片描述

物件配接器的優點

物件配接器和類配接器其實算是同一種思想,只不過實作方式不同,根據合成復用原則,使用組合替代繼承, 所以它解決了類配接器必須繼承被適配者的局限性問題;


介面配接器模式

  • 介面配接器模式(Default Adapter Pattern),也叫預設配接器模式;
  • 核心思路:當不需要全部實作介面提供的方法時,可先設計一個抽象類實作介面,并為該介面中每個方法提供一個默認實作(空方法),該抽象類的子類可有選擇地覆寫父類的某些方法來實作需求;
  • 適用于一個介面不想使用其所有的方法的情況;

定義一個配接器介面:

public interface InterfaceTest {
	public void m1();
	public void m2();
	public void m3();
	public void m4();
}

抽象類 AbsAdapter 將 InterfaceTest 的方法進行默認實作,當子類需要使用配接器介面中的某個方法,而不是全部方法時,就可以通過繼承抽象類,來完成對需要使用的特定方法重寫操作即可,無需實作配接器介面里面的全部方法

public abstract class AbsAdapter implements InterfaceTest {

	//默認實作
	public void m1() {}
	public void m2() {}
	public void m3() {}
	public void m4() {}
}

Client 呼叫介面,重寫配接器抽象類方法

public class Client {
	public static void main(String[] args) {
		
		AbsAdapter absAdapter = new AbsAdapter() {
			//只需要去覆寫我們 需要使用 介面方法
			@Override
			public void m1() {
				System.out.println("使用了m1的方法");
			}
		};
		
		absAdapter.m1();
	}
}

綜合小案例—使用類配接器模式

power–帶轉換的電壓

一個頂層介面Power

public interface Power
{
     Integer getOutPut();
}

分支一: 中國的220v電壓

//中國的電壓220V
public class ChinaPower implements Power
{
    private final Integer outPut=220;
    @Override
    public Integer getOutPut() {
        return outPut;
    }
}

分支二: 日本的110v電壓

//日本電壓110v
public class JapenPower implements Power
{
    private final Integer output=110;
    @Override
    public Integer getOutPut() {
        return output;
    }
}

adapter–配接器

失配器介面–DC5Adapter

//配接器介面
public interface DC5Adapter
{
    boolean support(Power power);
    Integer transTo5V(Power power);
}

配接器類—ChinaAdapter–只負責將220v電壓進行轉換的作業

//該配接器負責將中國的220v電壓轉化為5v的電壓
public class ChinaAdapter implements DC5Adapter
{
    //當前配接器只負責將220v電壓轉化為5v的功能實作
    private  static Integer voltage=220;
    //判斷當前配接器能否勝任傳入power電壓的轉化職責
    @Override
    public boolean support(Power power)
    {
      if(power.getOutPut().equals(voltage))
      return true;
      return false;
    }
    //將220v電壓轉換為5v的
    @Override
    public Integer transTo5V(Power power)
    {
        //獲得被適配類,即我們需要將220v電壓轉化為5v回傳
        Integer output=power.getOutPut();
        //進行電壓轉換操作
        return output/44;
    }
}

配接器類—JapenAdapter–只負責將110v電壓進行轉換的作業

//該配接器負責將日本的110v電壓轉化為5v的電壓
public class JapenAdapter implements DC5Adapter
{
    //當前配接器只負責將110v電壓轉化為5v的功能實作
    private  static Integer voltage=110;
    //判斷是否支持將日本110v電壓轉化為5v電壓的操作
    @Override
    public boolean support(Power power) {
        if(power.getOutPut()==voltage)
            return true;
        return false;
    }
    //將110v電壓轉換為5v的
    @Override
    public Integer transTo5V(Power power)
    {
        //獲得被適配類,即我們需要將110v電壓轉化為5v回傳
        Integer output=power.getOutPut();
        //進行電壓轉換操作
        return output/22;
    }
}

FindAdapter–尋找合適的配接器

//手機需要5v的電壓進行充電
public class FindAdapter
{
    //存放所有配接器的set集合
    private static final Set<DC5Adapter> DC5Adapters=new HashSet<>();
    //通過靜態代碼塊進行初始化操作
    static
    {
        DC5Adapters.add(new ChinaAdapter());
        DC5Adapters.add(new JapenAdapter());
    }
    // 根據電壓找合適的變壓器
    public DC5Adapter getPowerAdapter(Power power)
    {
        DC5Adapter dc5Adapter=null;
        for(DC5Adapter da:DC5Adapters)
        {
            //如果遍歷到當前電壓合適的變壓器就直接退出遍歷
            if(da.support(power))
            {
                dc5Adapter=da;
                break;
            }
        }
        //如果遍歷完所有的變壓器都沒有找到合適的,就拋出例外
        if(dc5Adapter==null)
        {
            throw  new IllegalArgumentException("未能找到合適的變壓器");
        }
        //回傳找到的合適的變壓器
        return dc5Adapter;
    }
}

測驗

public class test
{
    @Test
    public void test()
    {
        //找尋合適的變壓器是第一步
        FindAdapter fa=new FindAdapter();
        //找尋可以將220v轉化為5v的變壓器,即配接器
        DC5Adapter adapter = fa.getPowerAdapter(new ChinaPower());
        //輸出當前變壓器轉化之后的電壓
        System.out.println(adapter.transTo5V(new ChinaPower()));
    }
}

在這里插入圖片描述


配接器模式總結

主要優點

  • 將目標類和適配者類解耦,通過引入一個配接器類來重用現有的適配者類,無須修改原有結構,
  • 增加了類的透明性和復用性,將具體的業務實作程序封裝在適配者類中,對于客戶端類而言是透明的,而且提高了適配者的復用性,同一個適配者類可以在多個不同的系統中復用,
  • 靈活性和擴展性都非常好,通過使用組態檔,可以很方便地更換配接器,也可以在不修改原有代碼的基礎上增加新的配接器類,完全符合“開閉原則”,

具體來說,類配接器模式還有如下優點:

  • 由于配接器類是適配者類(配接器介面或配接器介面實作的抽象類)的子類,因此可以在配接器類中置換一些適配者(配接器介面或配接器介面實作的抽象類)的方法,使得配接器的靈活性更強,
  • 一個物件配接器可以把多個不同的適配者(配接器介面或配接器介面實作的抽象類)適配到同一個目標;
  • 可以適配一個適配者的子類,由于配接器和適配者(配接器介面或配接器介面實作的抽象類)之間是關聯關系,根據“里氏代換原則”,適配者(配接器介面或配接器介面實作的抽象類)的子類也可通過該配接器進行適配,

主要缺點

  • 對于Java、C#等不支持多重類繼承的語言,一次最多只能適配一個適配者類(配接器介面或配接器介面實作的抽象類),不能同時適配多個適配者;
  • 適配者類不能為最終類,如在Java中不能為final類,C#中不能為sealed類;
  • 在Java、C#等語言中,類配接器模式中的目標抽象類只能為介面,不能為類,其使用有一定的局限性,
  • 與類配接器模式相比,要在配接器中置換適配者類的某些方法比較麻煩,如果一定要置換掉適配者類的一個或多個方法,可以先做一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當做真正的適配者進行適配,實作程序較為復雜,

適用場景

  • 系統需要使用一些現有的類,而這些類的介面(如方法名)不符合系統的需要,甚至沒有這些類的源代碼,
  • 想創建一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起作業,

spring MVC中的配接器模式

springMVC處理請求流程

在這里插入圖片描述

  • 第1步 用戶發送請求至前端控制器DispatcherServlet;
  • 第2,3步DispatcherServlet收到請求,根據請求url呼叫HandlerMapping處理器映射器找到具體的處理器;生成處理器物件及處理器攔截器(如果有則生成)一并回傳給DispatcherServlet;
  • 第4步 DispatcherServlet通過HandlerAdapter處理器配接器呼叫具體的處理器;(這一步用到適配者模式)
  • 第5,6步 執行處理器(Controller,也叫后端控制器),回傳ModelAndView;
  • 第7步 HandlerAdapter將controller執行結果ModelAndView回傳給DispatcherServlet
  • 第8步DispatcherServlet將ModelAndView傳給ViewReslover視圖決議器(但是如果加上@responsebody注解,則回傳值不通過viewResolver,而是直接回傳object);
  • 第9步 ViewReslover決議后回傳具體View;
  • 第10步 DispatcherServlet對View進行渲染視圖(即將模型資料填充至視圖中);
  • 第11步 DispatcherServlet回應用戶,

SpringMVM 中的 HandlerAdapter(上圖的第4步), 就使用了配接器模式;


請求處理方法中配接器模式部分原始碼探究

在這里插入圖片描述

Spring MVC中的配接器模式主要用于執行目標 Controller 中的請求處理方法,

在Spring MVC中,DispatcherServlet 作為用戶,HandlerAdapter 作為期望介面(配接器介面),具體的配接器實作類用于對目標類進行適配,Controller 作為需要適配的類,

為什么要在 Spring MVC 中使用配接器模式?Spring MVC 中的 Controller 種類眾多,不同型別的 Controller 通過不同的方法來對請求進行處理,如果不利用配接器模式的話,DispatcherServlet 直接獲取對應型別的 Controller,需要的自行來判斷,像下面這段代碼一樣:

if(mappedHandler.getHandler() instanceof MultiActionController){  
   ((MultiActionController)mappedHandler.getHandler()).xxx  
}else if(mappedHandler.getHandler() instanceof XXX){  
    ...  
}else if(...){  
   ...  
}  

這樣假設如果我們增加一個 HardController,就要在代碼中加入一行 if(mappedHandler.getHandler() instanceof HardController),這種形式就使得程式難以維護,也違反了設計模式中的開閉原則 – 對擴展開放,對修改關閉,

我們來看看原始碼,首先是配接器介面 HandlerAdapter

//配接器介面
public interface HandlerAdapter 
{
    //判斷當前的controller請求是否能被當前的配接器類處理
    boolean supports(Object var1);
      
      //只有當支持處理當前請求后,才會執行下面的處理請求方法,回傳一個ModelAndView物件
     ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

    long getLastModified(HttpServletRequest var1, Object var2);
}

現該介面的配接器每一個 Controller 都有一個配接器與之對應,這樣的話,每自定義一個 Controller 需要定義一個實作 HandlerAdapter 的配接器,

springmvc 中提供的 Controller 實作類有如下:
在這里插入圖片描述
springmvc 中提供的 HandlerAdapter 實作類如下
在這里插入圖片描述
HttpRequestHandlerAdapter 這個配接器代碼如下:

//不同的配接器類實作不同的功能
//當前的HttpRequestHandlerAdapter 配接器類,只負責處理關于HttpRequest相關的請求
public class HttpRequestHandlerAdapter implements HandlerAdapter {
    public HttpRequestHandlerAdapter() {
    }
    
    //判斷當前的controller請求是否是HttpRequestHandler型別的
    //當前配接器只支持處理當前型別的handler 
    public boolean supports(Object handler) {
        return handler instanceof HttpRequestHandler;
    }

    //如果驗證支持,會呼叫下面這個方法進行具體邏輯處理
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //先進行強制型別轉換,轉換為指定的handler型別,然后就可以呼叫該型別處理對應請求的方法了
    //呼叫HttpRequestHandler的handleRequest處理對應的請求
        ((HttpRequestHandler)handler).handleRequest(request, response);
        return null;
    }

    public long getLastModified(HttpServletRequest request, Object handler) {
        return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;
    }
}

當Spring容器啟動后,會將所有定義好的配接器物件存放在一個List集合中,當一個請求來臨時,DispatcherServlet 會通過 handler 的型別找到對應配接器,并將該配接器物件回傳給用戶,然后就可以統一通過配接器的 hanle() 方法來呼叫 Controller 中的用于處理請求的方法,

public class DispatcherServlet extends FrameworkServlet {
//用于存放所有HandlerAdapter配接器類的list集合
    private List<HandlerAdapter> handlerAdapters;
    
    //初始化handlerAdapters
    private void initHandlerAdapters(ApplicationContext context) {
        //..省略...
    }
    
    // 遍歷所有的 HandlerAdapters,通過 supports 判斷找到匹配的配接器
    protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
		for (HandlerAdapter ha : this.handlerAdapters) {
			if (logger.isTraceEnabled()) {
				logger.trace("Testing handler adapter [" + ha + "]");
			}
			if (ha.supports(handler)) {
				return ha;
			}
		}
	}
	
	// 分發請求,請求需要找到匹配的配接器來處理
	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpServletRequest processedRequest = request;
		HandlerExecutionChain mappedHandler = null;

		//找到能處理當前processedRequest,即request請求的handler
		mappedHandler = getHandler(processedRequest);
			
		// 確定當前handler匹配的配接器類.
		HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

		ha.getLastModified(request, mappedHandler.getHandler());
					
		mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    }
	// ...省略...
}	

通過配接器模式我們將所有的 controller 統一交給 HandlerAdapter 處理,免去了寫大量的 if-else 陳述句對 Controller 進行判斷,也更利于擴展新的 Controller 型別,


總結

在這里插入圖片描述
使用 HandlerAdapter 的原因分析:

如果處理器的型別不同,有多重實作方式,那么呼叫方式就不是確定的,如果直接呼叫 Controller 方法,就得不斷使用 if else 來進行判斷是哪一種子類然后執行,那么如果后面要擴展 Controller,就得修改原來的代碼,這樣違背了 OCP 原則;

說明:

  • Spring定義了一個適配介面,使得每一種Controller有一種對應的配接器實作類;
  • 配接器代替 controller執行相應的方法;
  • 擴展Controller時,只需要增加一個配接器類就完成了SpringMVC的擴展;

參考文章

設計模式 8 - 配接器模式與springmvc原始碼分析
設計模式 | 配接器模式及典型應用
配接器模式(SpringMVC原始碼分析)
設計模式 | 配接器模式及典型應用

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296863.html

標籤:其他

上一篇:畢業設計之 -- 基于單片機的人臉識別追蹤

下一篇:一 iOS 開發因“玩手機”被開除,段子照進現實了......

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more