文章詳情頁(yè)
java結(jié)構(gòu)性模式之變壓器模式介紹(三)
瀏覽:10日期:2024-06-27 18:46:13
內(nèi)容: 抽象類WindowAdapter是變壓器模式的一個(gè)例子抽象類WindowAdapter是為接受視窗的事件而準(zhǔn)備的。此抽象類內(nèi)所有的方法都是空的。 使用此類可以很方便地創(chuàng)立listener對(duì)象。置換(Override)你所感興趣的那個(gè)事件所對(duì)應(yīng)的方法。 如果你不使用此抽象類,那么你必然規(guī)律要實(shí)現(xiàn)WindowsListener接口,而那樣你就不得不實(shí)現(xiàn)所有接口中的方法, 即便是你不需要的事件所對(duì)應(yīng)的方法,你也要給出一個(gè)空的方法,而這顯然不方便。 顯然,抽象類WindowAdapter的目標(biāo)接口可以選得與源接口一樣,而不影響效果。 這就解釋了為什么目標(biāo)接口不出現(xiàn)在WindowAdapter類圖(見(jiàn)下面)里。 IMG http://www.yesky.com/20011225/jt1225-1-windowadapter.gif[/IMG] SwingUI類的代碼如下。 import java.awt.Color;import java.awt.BorderLayout;import java.awt.event.*;import javax.swing.*;class SwingUI extends JFrame implements ActionListener{ JLabel text, clicked; JButton button, clickButton; JPanel panel; private boolean m_clickMeMode = true; Public SwingUI() { text = new JLabel('我很高興!'); button = new JButton('理我'); button.addActionListener(this); panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setBackground(Color.white); getContentPane().add(panel); panel.add(BorderLayout.CENTER, text); panel.add(BorderLayout.SOUTH, button); } public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (m_clickMeMode) { text.setText('我很煩!'); button.setText('別理我'); m_clickMeMode = false; } else { text.setText('我很高興!'); button.setText('理我'); m_clickMeMode = true; } } public static void main(String[] args) { SwingUI frame = new SwingUI(); frame.setTitle('我'); WindowListener listener = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(listener); frame.pack(); frame.setVisible(true); }}代碼清單7. SwingUI類的源代碼。紅色的代碼就是使用WindowAdapter的無(wú)名內(nèi)部類。 顯然,由于無(wú)名內(nèi)部類是繼承自WindowAdapter抽象類,因此只需置換(override)掉我們需要的方法, 即windowClosing()而不必操心WindowListener的其它方法。 利用變壓器模式指方為圓中國(guó)古代有趙高指鹿為馬的故事。鹿與馬有很多相似之處,沒(méi)見(jiàn)過(guò)的人本就分辨不清,指一指可能沒(méi)什么大不了的。 指方為圓是否太過(guò)?非也。本例就是要指方為圓,需要的只是變壓器模式這個(gè)魔術(shù)手指(Magic Finger)。 變壓器模式在本例子的類圖如下。 IMG http://www.yesky.com/20011225/jt1225-1-cube2ball.gif[/IMG]package com.javapatterns.adapter.cube2ball;public class Cube{ public Cube(double width) { this.width = width; } public double calculateVolume() { return width * width * width; } public double calculateFaceArea() { return width * width; } public double getWidth() { return this.width; } public void setWidth(double width) { this.width = width; } private double width;}代碼清單8. Cube類的源代碼。。 package com.javapatterns.adapter.cube2ball;public interface BallIF{ double calculateArea(); double calculateVolume(); double getRadius(); void setRadius(double radius);}代碼清單9. BallIF接口的源代碼。 package com.javapatterns.adapter.cube2ball;public class MagicFinger implements BallIF{ public MagicFinger(Cube adaptee) { super(); this.adaptee = adaptee; radius = adaptee.getWidth(); } public double calculateArea() { return PI * 4.0D * ( radius * radius ); } public double calculateVolume() { return PI * 4.0D/3.0D * ( radius * radius * radius ); } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } private double radius = 0; private static final double PI = 3.14D; private Cube adaptee;}代碼清單10. MagicFinger類的源代碼。 如果讀者還記得中學(xué)的數(shù)學(xué)的話,應(yīng)該可以看出,我們的指方為圓系統(tǒng)其實(shí)還是有道理的。它接受一個(gè)正方體, 返還此正方體的內(nèi)切球,也就是能放進(jìn)此正方體的最大的球。 顯然,本例子里,我們使用的是實(shí)例形式的變壓器模式。這樣做的好處是,如果一旦我們決定不僅要支持正方體, 而且要支持四面體等多面體,我們可以使用同一個(gè)MagicFinger類,而不必針對(duì)每一個(gè)多面體都建立一個(gè)MagicFinger類。 這樣也比較符合“魔術(shù)手指這個(gè)名字。from-yesky Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽:
Java
相關(guān)文章:
1. 4種非常實(shí)用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)2. 學(xué)習(xí)PHP結(jié)構(gòu)圖3. vue路由結(jié)構(gòu)可設(shè)一層方便動(dòng)態(tài)添加路由操作4. springboot+mybatis plus實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)查詢5. PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】6. JavaScript隊(duì)列結(jié)構(gòu)Queue實(shí)現(xiàn)過(guò)程解析7. 基于python實(shí)現(xiàn)模擬數(shù)據(jù)結(jié)構(gòu)模型8. 簡(jiǎn)單了解XML 樹(shù)結(jié)構(gòu)9. python實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中雙向循環(huán)鏈表操作的示例10. js如何構(gòu)造elementUI樹(shù)狀菜單的數(shù)據(jù)結(jié)構(gòu)詳解
排行榜
