<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4

    [Jakarta Commons筆記] Commons Collections - Transformer組

    Posted on 2005-08-06 10:40 laogao 閱讀(2670) 評論(1)  編輯  收藏 所屬分類: On Java

     

    接下來看Transformer組。

     

    Transformer

    ChainedTransformer

    SwitchTransformer

    TransformerUtils

     

    我們有時候需要將某個對象轉換成另一個對象供另一組方法調用,而這兩類對象的類型有可能并不是出于同一個繼承體系的,或者說出了很基本的Object之外沒有共同的父類,或者我們根本不關心他們是不是有其他繼承關系,甚至就是同一個類的實例只是對我們而言無所謂,我們為了它能夠被后續的調用者有意義的識別和處理,在這樣的情形,我們就可以利用Transformer。除了基本的轉型Transformer之外,Commons Collections還提供了Transformer鏈和帶條件的Transformer,使得我們很方便的組裝出有意義的轉型邏輯。

     

    假定我們在處理員工聘用時,需要將原來的Applicant對象轉換為Employee對象,而Applicant類和Employee類無論繼承關系、字段內容、具體業務職能等等都不是同一派系的,只是某些字段是相關的,且要求必要的轉換,那么這個時候我們使用Transformer就可以比較方便的實現這項功能,并且由于它的實現是靈活的、模塊化的,使得今后的維護也變得清晰和易于處理。代碼如下:

     

    /** Applicant.java */

     

    package sean.study.commons.collections;

     

    import org.apache.commons.lang.builder.ToStringBuilder;

    import org.apache.commons.lang.builder.ToStringStyle;

     

    public class Applicant {

       

        private String name;

        private int age;

        private String applyFor;

       

        public Applicant() {

        }

     

        public Applicant(String name, int age, String applyFor) {

            this.name = name;

            this.age = age;

            this.applyFor = applyFor;

        }

       

        public String toString() {

            return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

                    .append("name", name)

                    .append("age", age)

                    .append("applyFor", applyFor)

                    .toString();

        }

     

        public int getAge() {

            return age;

        }

     

        public void setAge(int age) {

            this.age = age;

        }

     

        public String getApplyFor() {

            return applyFor;

        }

     

        public void setApplyFor(String applyFor) {

            this.applyFor = applyFor;

        }

     

        public String getName() {

            return name;

        }

     

        public void setName(String name) {

            this.name = name;

        }

     

    }

     

    /** Employee.java */

     

    package sean.study.commons.collections;

     

    import java.util.Date;

     

    import org.apache.commons.lang.builder.ToStringBuilder;

    import org.apache.commons.lang.builder.ToStringStyle;

    import org.apache.commons.lang.time.DateFormatUtils;

     

    public class Employee {

     

        private String name;

        private int age;

        private Date dateJoined;

        private String grade;

        private double salary;

       

        public Employee() {

        }

     

        public Employee(String name, int age, Date dateJoined, String grade, double salary) {

            this.name = name;

            this.age = age;

            this.dateJoined = dateJoined;

            this.grade = grade;

            this.salary = salary;

        }

       

        public String toString() {

            return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

                    .append("name", name)

                    .append("age", age)

                    .append("dateJoined", DateFormatUtils.format(dateJoined, "yyyy-MM-dd"))

                    .append("grade", grade)

                    .append("salary", salary)

                    .toString();

        }

     

        public int getAge() {

            return age;

        }

     

        public void setAge(int age) {

            this.age = age;

        }

     

        public Date getDateJoined() {

            return dateJoined;

        }

     

        public void setDateJoined(Date dateJoined) {

            this.dateJoined = dateJoined;

        }

     

        public String getGrade() {

            return grade;

        }

     

        public void setGrade(String grade) {

            this.grade = grade;

        }

     

        public String getName() {

            return name;

        }

     

        public void setName(String name) {

            this.name = name;

        }

     

        public double getSalary() {

            return salary;

        }

     

        public void setSalary(double salary) {

            this.salary = salary;

        }

     

    }

     

    /** TransformerUsage.java */

     

    package sean.study.commons.collections;

     

    import java.util.Arrays;

    import java.util.Collection;

    import java.util.Date;

    import java.util.Iterator;

    import java.util.List;

     

    import org.apache.commons.collections.CollectionUtils;

    import org.apache.commons.collections.Predicate;

    import org.apache.commons.collections.Transformer;

    import org.apache.commons.collections.functors.SwitchTransformer;

    import org.apache.commons.lang.StringUtils;

     

    public class TransformerUsage {

     

        public static void main(String[] args) {

            demoTransformerUsage();

        }

       

        public static void demoTransformerUsage() {

     

            System.out.println(StringUtils.center(" demoTransformerUsage ", 40, "="));

     

            // data setup

            Applicant[] applicants = new Applicant[] {

                new Applicant("Tony", 26, "Developer"),

                new Applicant("Michelle", 24, "Tester"),

                new Applicant("Jack", 28, "Project Manager")

            };

            List appList = Arrays.asList(applicants);

           

            // predicate setup

            Predicate isDeveloper = new Predicate() {

                public boolean evaluate(Object obj) {

                    Applicant app = (Applicant) obj;

                    return "Developer".equalsIgnoreCase(app.getApplyFor());

                }

            };

            Predicate isTester = new Predicate() {

                public boolean evaluate(Object obj) {

                    Applicant app = (Applicant) obj;

                    return "Tester".equalsIgnoreCase(app.getApplyFor());

                }

            };

            Predicate isPM = new Predicate() {

                public boolean evaluate(Object obj) {

                    Applicant app = (Applicant) obj;

                    return "Project Manager".equalsIgnoreCase(app.getApplyFor());

                }

            };

            Predicate[] checkApplyFor = new Predicate[] {

                isDeveloper,

                isTester,

                isPM

            };

           

            // transformer setup

            Transformer developerTransformer = new Transformer() {

                public Object transform(Object obj) {

                    Applicant app = (Applicant) obj;

                    return new Employee(

                        app.getName(), app.getAge(), new Date(), "E4", 2000

                    );

                }

            };

            Transformer testerTransformer = new Transformer() {

                public Object transform(Object obj) {

                    Applicant app = (Applicant) obj;

                    return new Employee(

                        app.getName(), app.getAge(), new Date(), "E4", 2000

                    );

                }

            };

            Transformer pmTransformer = new Transformer() {

                public Object transform(Object obj) {

                    Applicant app = (Applicant) obj;

                    return new Employee(

                        app.getName(), app.getAge(), new Date(), "E5", 3000

                    );

                }

            };

            Transformer[] transformers = new Transformer[] {

                developerTransformer,

                testerTransformer,

                pmTransformer

            };

           

            // transform

            Transformer employTransformer = new SwitchTransformer(

                checkApplyFor, transformers, null

            );

            Collection employed = CollectionUtils.collect(appList, employTransformer);

           

            // output

            System.out.println("Applicants: ");

            Iterator iter1 = appList.iterator();

            while (iter1.hasNext()) {

                System.out.println(iter1.next());

            }

            System.out.println("Employed: ");

            Iterator iter2 = employed.iterator();

            while (iter2.hasNext()) {

                System.out.println(iter2.next());

            }

     

            System.out.println(StringUtils.repeat("=", 40));

        }

     

    }

     

    以下是運行結果:

     

    ========= demoTransformerUsage =========

    Applicants:

    Applicant[name=Tony,age=26,applyFor=Developer]

    Applicant[name=Michelle,age=24,applyFor=Tester]

    Applicant[name=Jack,age=28,applyFor=Project Manager]

    Employed:

    Employee[name=Tony,age=26,dateJoined=2005-08-05,grade=E4,salary=2000.0]

    Employee[name=Michelle,age=24,dateJoined=2005-08-05,grade=E4,salary=2000.0]

    Employee[name=Jack,age=28,dateJoined=2005-08-05,grade=E5,salary=3000.0]

    ========================================

     

    我們首先定義一組Predicate,用于在SwitchTransformer中判斷采用那個具體的Transformer,這個具體的Transformer也是通過數組同時傳遞給SwitchTransformer的構造方法的。不同的Predicate可以有不同的實現,不同的Transformer也可以有不同的實現,因為它們之間實際上完全是相互獨立的。這就使我們有效的分離了邏輯和具體業務。

     

     

    Feedback

    # re: [Jakarta Commons筆記] Commons Collections - Transformer組  回復  更多評論   

    2006-12-10 00:25 by
    言簡意賅,非常清楚
    主站蜘蛛池模板: 亚洲中文无码卡通动漫野外| 国产免费久久精品丫丫| 全部免费国产潢色一级| 中文字幕免费在线视频| 亚洲欧洲在线播放| 午夜亚洲国产成人不卡在线| 一级毛片全部免费播放| 亚洲午夜无码久久久久软件| 久久精品亚洲男人的天堂| 国产精品永久免费10000| 三年片在线观看免费观看大全中国| 亚洲AV无码久久精品色欲| 免费视频中文字幕| 久久狠狠躁免费观看2020| 在线观看亚洲视频| 亚洲视频免费一区| 亚洲精品一级无码鲁丝片| 99久久久精品免费观看国产| 一级黄色免费网站| 亚洲va久久久久| 国产成人A人亚洲精品无码| 日本不卡在线观看免费v| 69视频免费观看l| 一级毛片免费一级直接观看| 精品亚洲成A人无码成A在线观看| 亚洲欧洲日产国码一级毛片| 在线免费观看污网站| 67pao强力打造国产免费| 一区二区三区免费精品视频| 亚洲最大中文字幕无码网站| 97se亚洲综合在线| 国产亚洲av人片在线观看| 日本高清色本免费现在观看| 91手机看片国产永久免费| 国产一级黄片儿免费看| 日韩少妇内射免费播放| 亚洲精品9999久久久久无码| 亚洲成av人片不卡无码| 麻豆亚洲AV永久无码精品久久| 亚洲精品97久久中文字幕无码| 日本一道在线日本一道高清不卡免费 |