導航:首頁 > 編程語言 > 委託模式java

委託模式java

發布時間:2023-05-21 06:03:34

『壹』 java中的單例模式 和c#中的委託是不是同一模式 具體講解一下

C#的委託 相當於C語言中的函友燃宏數指針 只不過委託指向的段渣是一個方法/事件 道理是一樣的,java的單例模式 是設計模式中的一種 ;分為三種情況 一好冊種是餓漢模式 一種是懶漢模式 還一個登記式單例 所以兩者不一樣

『貳』 java中有沒有類似C#委託功能的機制

線程,c#也有線程灶盯和java差隱告和不多,但是c#線程里操控控制項不允許,需要用委託,委託可以理解找人幫忙做某件事,就是去友冊調用某個方法

『叄』 java雙親委託機制是什麼意思

這個機制是 java class loader 范疇的內容。『櫻和

java 虛擬機要將被用到的java類文件通過classLoader 載入到JVM內存中。
首先classloader 分三個級別,最上級 : bootstrap classLoader 中間級:extension classLoader 最低級 app classLoader.
當需要載入某個類的時候,會看看這個類是否已經被載入了,如果沒有,會請求app 級來載入,app 請求 extension 級 extension 請求 bootstrap級, 由最高級來負責載入(這個就是雙親委派,委託 上兩級的loader來做載入),如果高級的無法載入 則會將人物返回給 下一級 以此類推 最後如果雙親都不行 就由自己來載入。 為什麼要用這個機制橘陵? 比如 java.lang.String 這個類,這個是jdk提圓頌戚供的類, 如果我們自定義個 包名:java.lang 然後在裡面創建一個String 類, 當我在用String類的時候,根據前面所說,是由bootstrap級的loader 來進行載入的,這個時候它發現其實已經載入過了jdk的String了,那麼就不會去載入自定義的String了,防止了重復載入 也加大了安全性。
純手打,有問題指正。

『肆』 委託代理模式的舉例

下面的代碼,則是作為一個委託的例子,實現Map的功好伍姿能。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bs2.core.UtilLog;
/**
* @author Liusheng
* 本代碼主橘殲要用於演示RelegateTo的使用方法
*/
public class Delegator4Map extends Delegator {
private static Log _log = LogFactory.getLog(Delegator4Map.class);
private Map orginClass = null; //原始友絕對象
private Map proxyClass = null; //代理對象
public Map getOrgin() { return orginClass; }
public Map getProxy() { return proxyClass; }
public Delegator4Map(Map orgin) {
super(orgin);
orginClass = orgin;
proxyClass = (Map)super.obj_proxy;
}
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
if (method.getName().equals(size)) { //修改close處理邏輯
_log.debug(原始 size()=+super.invoke(obj, method, args));
Object res2 = new Integer(-1);
_log.debug(修改 size()=+res2);
return res2;
}else {
return super.invoke(obj, method, args);
}
}
public static void main(String[] args) throws IOException {
UtilLog.configureClassPath(resources/log4j.properties, false);
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
_log.debug(代理:+m.toString());
}
}

『伍』 Java中什麼是委託事件處理模型

什麼是委託事件模型
在教材上的圖中,我們可以發現,用戶通過鍵盤、滑鼠等進行操縱的行為,最終都傳遞給了JVM,那麼JVM在接收到這些事件以後該如何處理呢?我們把這種處理事件的方案,稱之為事件模型。

Java中採用的是委託事件模型:jdk1.1以後,引入的一種新的事件代理模塊,通過它,事件源發出的事件被委託給(注冊了的)事件監聽器(Listener),並由它負責執行相應的響應方法。比如:病人生病請醫生。

基於這種模型,我們使用兩種類型的對象來執行事件機制,這兩種對象是:
事件源對象
事件的偵聽對象

委託事件模型的實現步驟
在java語言中委託事件模型的處理步驟如下:
1.建立事件源對象。如各種GUI的組件。
2.為事件源對象選擇合適的事件監聽器。比如事件源對象如果是「按鈕」,那麼我們能想到的發生在按鈕身上最多的,應該是單擊事件了。這時我就應該選擇滑鼠單擊事件的監聽器。
3.為監聽器添加適當的處理程序。比如當按鈕單擊事件發生後,希望完成的代碼。
4.為監聽器與事件源建立聯系。

窗體自身實現事件監聽
我們在剛才的例子中使用了兩個對象,一個是事件源對象,即JFrame窗體,另外還創建了一個監聽器對象。事實上在實際開發過程中,我們往往,將這兩個類寫在一起,就是說一個窗體類自己監聽自己的事件

其他事件監聽器介面的使用
Java支持的事件監聽器介面非常多,常見的主要有:

ActionListener 行為監聽介面
AdjustmentListener 調整監聽介面
ItemListener 選項監聽介面
TextListener 文本監聽介面
ComponentListener 組件監聽介面
KeyListener 鍵盤監聽介面
MouseListener 滑鼠點擊監聽介面
MouseMotionListener 滑鼠移動監聽介面
FocusListener 游標聚焦監聽介面
WindowListener 窗體監聽介面
ContainerListener 容器監聽介面

KeyListener介面與KeyAdapter類
KeyListener介面:監聽鍵盤事件。

該介面中定義了如下三個方法:
keyPressed() 鍵盤按下時觸發
keyReleased() 鍵盤釋放時觸發
keyTyped() 鍵盤單擊一次時觸發

KeyAdpeter適配器:即使我們只想使用上述三個方法中的一種,那麼我們也必須在KeyListener介面的實現類中對這三種方法進行重寫,這種方式顯然增加了很多無效代碼,我們可以使用適配器模式解決。

匿名內部類

WindowListener介面與WindowAdapter類
WindowListener介面:監聽窗體的行為。

windowListener介面常用方法:
windowActivated(WindowEvent e) 將 Window 設置為活動 Window 時 調用。

windowClosed(WindowEvent e) 因對窗口調用 dispose 而將其關閉 時調用。
windowClosing(WindowEvent e) 用戶試圖從窗口的系統菜單中關閉窗 口時調用。
windowDeactivated(WindowEvent e) 當 Window 不再是活動 Window 時調用。
windowDeiconified(WindowEvent e) 窗口從最小化狀態變為正常狀 態時調用。

windowIconified(WindowEvent e) 窗口從正常狀態變為最小化狀態 時調用。

windowOpened(WindowEvent e) 窗口首次變為可見時調用。

MouseListener介面與MouseAdapter類
MouseListener介面:監聽滑鼠點擊的行為。

MouseListener介面常用方法:
mouseClicked(MouseEvent e) 滑鼠按鍵在組件上單擊(按下並釋放)時調用。
mouseEntered(MouseEvent e) 滑鼠進入到組件上時調用。
mouseExited(MouseEvent e) 滑鼠離開組件時調用。
mousePressed(MouseEvent e) 滑鼠按鍵在組件上按下時調用。
mouseReleased(MouseEvent e) 滑鼠按鈕在組件上釋放時調用。

MouseMotionListener介面與MouseMotionAdapter類
MouseMotionListener介面:監聽滑鼠移動的行為。

MouseMotionListener介面常用方法:
mouseDragged(MouseEvent e) 滑鼠按鍵在組件上按下並拖動時調用。
mouseMoved(MouseEvent e) 滑鼠按鍵在組件上移動(無按鍵按下)時調用

『陸』 java語言中委託的實現方法

委託是C、OC和C#中的才有,在java中是叫介面(interface )。

嫌瞎襪實現介面可芹激以使用關鍵字implements,假設有介面神模Animal,那麼實現介面代碼示範如下:

classcatimplementsAnimal
{
publicvoidshout()
{
int(「喵喵」);
}
}

『柒』 Java:如何編寫自己的Java類載入器

給你簡單介紹一下類載入器

1.類載入器就載入位元組碼文件(.class)

public class FileClassLoader extends ClassLoader {String rootDir=null;public FileClassLoader(String rootDir) {this.rootDir = rootDir;}@Overrideprotected Class<?> findClass(String className) throws ClassNotFoundException {//首先檢查是否已經被載入了。Class<?> c = findLoadedClass(className);String path = rootDir + "/" + className.replace('.', '/') + ".class";if (c != null) {return c;} else {/*雙親委託模式*/ClassLoader loaderParent = this.getParent();c = loaderParent.loadClass(className);if (c != null) {return c;} else {/*如果再不行的話,就再進行載入。因為位元組碼的本質就是一個位元組數組*/InputStream is = null;ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {is = new FileInputStream(path);byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}c = defineClass(className, buffer, 0, buffer.length);}catch (Exception e) {e.printStackTrace();}finally {if (is != null) {try {is.close();}讓亮蠢catch (IOException e) {鍵棗e.printStackTrace();}}}}return c;}}

}

/*

相同的類載入器對同一個類進行載入,得到的hascode是相同的

* 不同的類載入器對同一類進行載入,得到的hascode是不一樣的*/public class Demo {public static void main(String[] args) {FileClassLoader loader = new FileClassLoader("c://myjava");FileClassLoader loader2=new FileClassLoader("c://myjava");try {Class<?> c = loader.findClass("com.lg.test.HelloWorld");Class<?> c0=loader.findClass("com.lg.test.HelloWorld");Class<?> c1=loader2.findClass("com.lg.test.HelloWorld");Class<?> c2=loader.findClass("com.lg.test.Demo01");Class<?> c3=loader.findClass("java.lang.String"坦陪);System.out.println(c.hashCode());System.out.println(c.getClassLoader());System.out.println(c0.hashCode());System.out.println(c0.getClassLoader());System.out.println(c1.hashCode());System.out.println(c1.getClassLoader());System.out.println(c2.hashCode());System.out.println(c2.getClassLoader());System.out.println(c3.hashCode());System.out.println(c3.getClassLoader());}catch (ClassNotFoundException e) {e.printStackTrace();}}}

『捌』 java中的委託

委託模式是軟體設計模式中的一項基本技巧。在委託模式中,有兩個對象參與處理同一個請求,接受請求的對象將請求委託給另一個對象來處理。委託模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委託模式。委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin。
「委託」在C#中是一個語言級特性,而在Java語言中沒有直接的對應,但是我們可以通過動態代理來實現委託!代碼如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* @author Liusheng
* 實現「委託」模式,用戶需要實現InvocationHandler介面;
* 參考:http://www.uml.org.cn/j2ee/200411036.htm
*/
public abstract class Delegator implements InvocationHandler {
//--------------------------------------------

protected Object obj_orgin = null; //原始對象
protected Object obj_proxy = null; //代理對象
//--------------------------------------------

public Delegator() {
}

public Delegator(Object orgin) {
this.createProxy(orgin);
}
/*
* 完成原始對象和委託對象的實例化
* @param orgin 原始對象實例
*/

protected Object createProxy(Object orgin) {
obj_orgin = orgin;
//下面語句中orgin.getClass().getClassLoader()為載入器,orgin.getClass().getInterfaces()為介面集
obj_proxy = Proxy.newProxyInstance(orgin.getClass().getClassLoader(), orgin.getClass().getInterfaces(), this); //委託
return obj_proxy;
}
/*
* 對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法,具體請參見Java API
* @param args 參數
* @param method 方法類實例
*/

protected Object invokeSuper(Method method, Object[] args) throws Throwable {
return method.invoke(obj_orgin, args);
}
//--------------實現InvocationHandler介面,要求覆蓋------------
//下面實現的方法是當委託的類調用toString()方法時,操作其他方法而不是該類默認的toString(),這個類的其他方法則不會。

public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
// 預設實現:委託給obj_orgin完成對應的操作
if (method.getName().equals("toString")) { //對其做額外處理
return this.invokeSuper(method, args) + "$Proxy";
} else { //注意,調用原始對象的方法,而不是代理的(obj==obj_proxy)
return this.invokeSuper(method, args);
}
}
}

下面的代碼,則是作為一個委託的例子,實現Map的功能。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bs2.core.UtilLog;
/**
* @author Liusheng
* 本代碼主要用於演示RelegateTo的使用方法
*/
public class Delegator4Map extends Delegator {
private static Log _log = LogFactory.getLog(Delegator4Map.class);
private Map orginClass = null; //原始對象
private Map proxyClass = null; //代理對象

public Map getOrgin() {
return orginClass;
}

public Map getProxy() {
return proxyClass;
}

public Delegator4Map(Map orgin) {
super(orgin);
orginClass = orgin;
proxyClass = (Map) super.obj_proxy;
}

public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
if (method.getName().equals("size")) { //修改size處理邏輯
Object res2 = new Integer(-1);
System.out.println("調用委託的方法");
return res2;
} else {
System.out.println("調用原始的方法");
return super.invoke(obj, method, args);
}
}

public static void main(String[] args) throws IOException {
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
}
}

『玖』 在Java中沒有C#的delegate類型,ref和out類型的參數,那在Java中如何變通地實現相同功能

delegate你可以用相關對象的addXXXListener實現,如果沒有你想要的listener,你可以自己寫一個,然後在set方法裡面通知這些listener就可以了,比方你要監視Obj的屬性變化,可以這樣,先定義一個借口PropertyChangeListener{public void execute();}
class Obj{
List<PropertyChangeListener> listeners;
void firePropertyChanged(PropertyChangeEvent e){
for (PropertyChangeListener l:listeners){
l.execute(e);
}
}
void addPropertyChangeListener(PropertyChangeListener l){
listeners.add(l);
}
}

ref就是傳引用,隨便一個對象就可以傳引用,除了String,還有out,你直接在函數裡面修改傳引用的參數就ok

『拾』 javascritp,事件委託流程

設計模式的委託分三部分吧
首先是代理event proxy
然後是需要執行的流程process

然後是返回結果callback
具體我就以jquery為例
$(...).on('') 這個就是創建代理,至於說是不是onclick這個都另說,因為即使是DOM事件我們也視作是一個事件代理
$(..).fire(callback)這個就是執行你的代理事件,當中的callback就是你的返回結果
這樣你就只需要關心事件本身

閱讀全文

與委託模式java相關的資料

熱點內容
博科清空命令 瀏覽:384
簡愛英文pdf 瀏覽:376
cnc編程有前途嗎 瀏覽:586
聯想app怎麼聯網 瀏覽:722
linuxftp命令登錄 瀏覽:1000
android獲取圖片縮略圖 瀏覽:646
神戶制鋼螺桿壓縮機 瀏覽:29
差分演化演算法 瀏覽:567
中山市加密軟體 瀏覽:446
mc反編譯源碼 瀏覽:139
企業商城網站源碼 瀏覽:411
shell腳本編程是什麼 瀏覽:762
單片機led閃爍匯編 瀏覽:203
點淘app怎麼沒金蛋了 瀏覽:878
app拉新哪裡找推廣碼 瀏覽:935
哪個app生活服務好 瀏覽:108
mht安卓用什麼軟體打開 瀏覽:320
html5即時通訊源碼 瀏覽:144
python編程基礎豆瓣 瀏覽:710
程序員亂碼是什麼意思 瀏覽:372