|
ÁÍ˙ ˙Ý
˙ÁÍ ÍÍ ÔÁÍ Ĺ ˙ÁÍ ÜÁßĎß áÍ ÝßË Ĺ Allen Holub ŕ ß JavaWorld ÍÎßÍ Î :ÝÍ ÁÍ˙ ÍÍ ˙ÔÁÍ Ĺ ˙ÁÍ ÍĚ ŕÎÁËÁ áÍ Ú ŕ Ţ :ĹÁ ˙Î ÝÎÁËÍ˙ ŢŔ Ţ ŕ Á ÍË ŕ ˙ ÜÁ :ŕ ÍßéÔ ŕé ËéÁß ÍŐ ËÍß ˙ÝÍ ŕ ˙Áŕß ŕ ÁÍ Ţ Ë ˙ËÎ ŕß ŕé ˙é ÍÎ ˙Ô ÜË ß GUI Ý ÍÎ Ţ ÔÁßÍ ß Ëß ŕ ÍËß .ËÁË ÝÁß Ţ ŹËÍ ÜÁË .Ëéßé ÜéÍÁ Íé ŕ ĹŔ ŕ ĹÁ Ůß Ü Í ˙ßÍ ÎÁ ˙ Íé ŕÁÍ Ź˙éË ŕ ˙ß ËÍÁË ËÍÍ ˙Ë ˙ĹŔ ˙ÁÍ ŕß ŢÁ ŕ Á ŹÜËé ÉéÔé Đé ˙éË ÍË ˙ÁÍ Ë ÝËÁ ŕÁ ÜßÁ .Ë˙ ˙ ĹééŔ ˙Ë ÍÁÍ ÍË ˙ÁÍ Ë ß .ËÍßŔ˙ ËË ÁÍ áÍÁË Ĺ ĹééŔ ˙ÍÔ ÎÁ .ËÎ˙ ÍÁßË ÁÍ Úß Ë Í ĹÁÍ ÝÁ ß Ëß˙ Ń Éß ÁÍ ˙Áŕß ÁĚ .ËË Ń ÁÍ Ëß ŮÍÔ Ë ŕ ˙ ÁÍ ŕ ËÁß ˙ Ý ÎÁ ß Ëé ŕ ÁË ÁÍ MVC (Model/View/Controller) áÍ Ü ŕ ÝË ˙ ÖÁÎé éÁ Úéé ˙ MFC (Microsoft Foundation Classes) ˙Á ŘË ˙ÍÔ .ËË ÝÁ ÁÍ ŕ ŕěÁÍÁ ß (ÜË) Ĺ Üéěé Ĺßé ŢŔ ËÍ ŕ Í Ĺ ß ˙ ĹŔ Ţ Ë ŹÜ Í ˙ÁÍ :ËÍÁË ÁÍ ÍÎ ŘÍ ÎÁ ˙ Ĺ ŹÁÍ˙ ˙ÁÍÔ ˙Ë ÍË .Ýß Í ÎÁ Đ ŢËÁË ÍÁÍ Î ˙ÁÍ ŕ ĹŔ ˙ ÎÁ ˙Í ÎÁ ˙Ďß Ú Ź(éĹéééŔ ÎÁ ˙éé) salary ŕß ˙ÁÍ .ËßÍ˙ Í ŕ ĹŔ ˙ Îééé é (ËÁÍéÁ Ý ) ĹŔ Í ÍÎ Đ ÎÁ ÁÍ (ŢÁËÍ) employees Íééé Ůß ŢÁËÍ ŕ .Ë ËÍ ŹËÍ Ůß ŕ áËÁÍÁ .Ë˙ Íé ÎÁ ÁÍ ŢŔ ŕ ĹŔ ÎÁ ˙ ˙Ďß .ĹÁ ËÍ Ĺ Ůß Đ .Ë ÍééËéé ÎÁ ÁÍ ŢÁËÍ ŹËÍ Ý ŕß ˙ÁÍ ŹË˙ Î ĹŔ ˙é (ŕËéÎÁËÍé ÎéÍ ß ËÁÍÁ ) Ý ÎÁ ÁË Đ ßË .Ë˙ Î ÎÁ ŢÁËééÍ ŢËß Î ˙ÁÍ Ý ÁĚ .Ë ŕ ÁË Ý Ĺ ËÁß .ËßÍ˙ Í ŕ (ÍË ÎÁ ŕËÎÁËÍ ÎÍ ) ÍË Íéé ÎÁ ŹÁÍ ĹÁ ÎÁ Đ Ú ËÁß ˙ ĹŔ :Ë Ĺ ËÍ .ËË Ň Ë Ë Ĺ ĹéË áÍÁ ĹÍß ŕ ËÁß ˙ Ůß ŕß ˙ÁÍ .Ĺ Ţ Ë Ĺ Ůßéé ÇÁÍ Á ˙ÁÍ Î ËÍß SQL ŕ ASCII ŕ Í ÜË Ë áÍ Ř ŹËß ŕÍĚ Á Ë .Ë ... ß Ë˙ ŕÍĚ ÁÍ ŕËÁË ŕ ÎÁ ˙Áß ŕéé ĹßË Ůß ŕ ÍË Ĺ ŮÍÔ ÎÁ ÁÍÁ ŢÎ ÍË ËÁß ˙ Á Ůßéé Îßéé ËÍ ŹËÍ˙ ĹÍß áÎ ŕÍĚ ŕ ÍŔ ËÍß ÍË ˙ .ËËÍ ˙éË ÍÁËé ŕ Á ÁÍ ˙ ÍÁ .ËÍÁË áÍ áÎ ŕË Ĺ .ËÍ˙ ŕËéé ˙ÁÍé ŕ ˙Ë ß Ë Í ËÁß ˙ Ĺ ŢŔ áÎ ŕË ŹË .ËßÍ Ţ ÎÁ ËÁß ˙ ËßÍ˙ Í ŕ áÎ Ĺéééé ŕÍÍË áÍ Ý ˙ÁÍ Ŕ ŕ ĹÁ Ĺ ˙ ˙Á ÜË ŢÁßé ˙ ŹË ŕ ÁË ÁÍ ˙ ĹŔ ÎÁ ˙ ÍÁ .Ë áÍßÍ ÍŐ ËÍß .ËË˙ ÝÁ Ĺ ŢŔ ÁÍ áÍ ŕ ĹŔ ËÍ ĹŔ ŕ Ĺ Ń Íé Řé ĹÍ ÍË ÁÍ ĹŔ ËË Ĺ ÝÍÁË Ë Áß ÎÁ áÍ ŹËÍ Ý Ô ŕ ĹÁ ÝÎ ĹßÁ ˙ .ÝË Ţ Ĺß ˙Í ˙ßÍ ŕÁßééË ˙éé ÍË Ĺ ŢÁ ŕ ß ÝË Ń ÁÍ ˙ Ë ŹŮß Ý Ëé é Ýéé Ĺé Ţ ŕ .ËŔ˙ ÍË Ń ŕ ŕÔßÍ ÝÍ ÍË Í ŕéßé .Ëéé˙éé Í (Employee.draw-yourself Ë) display-yourself ŕéééé Źŕß ˙ÁÍ .Ëß˙ ŕËÁË Ń ŮÍÔ Ţ ŕ Î Ĺ ŕ Ë áÍéÎé Ößé ŢéÁ Áß ÍË .ĹÁ Ĺ Î ŕÔ ËË Ú ĹÍß ŕ Ůß ŕé Ëé ˙ Í Ĺ ÎÁ ˙Í .ĹÁ áÍßÍ Ăß ˙ÁÍÔ UI ÍË ß .Ĺ Ń ŕß Ńé ŕ ĹÁ ˙ Ŕ ÎÁ UI Ëß áÎ ÁË ŹÍßĚ Ü ˙ÁÍ MVC Í ŕÁÍ ĹééŔ Ĺß ˙ Ë ÁÍ View ŕ ˙ÁŕË ÜÍ ŕÁÍ ŕ ŹËß˙ ŕËÁË ÎÁ Ýé Í ÍßÔ ŕ public ˙Ë Ĺ ŮÍÔ ÎÁ Ý ÍßÔ ŕ ) ß ŕé Í ÁÍ view áËßÍß ŹMVC ŕË ÜÍ ÍßÔ .(accessor ˙Ë ŮÍÔ ŢéÁ .Ëéé˙ ÉÁ ÁÍ ĹŔ Ĺß ß Í calls_to_set ˙Ë ŕ ÁÍ ŢŔ Íéé Í ŕËÁË ŕ ˙ Ë .Ë˙ Í ÁÍ˙ Ý ÍË ˙Ë ŕ ŕß ŘĚé .ËéŔ˙é Ëßéß ŕ view ß ÜË Ţ ˙Á ÔÁßÍ ŕ ÍË ß ĹÁ ˙Áß MVC .ĹéÁ ˙éÍÁ áÍééé ÍË ŕÔÁÍ ŢÁ Á .ĹÁ MVC ŘË view ÜË ŕÔÁÍ Ţé ŕÔÁÍ ŢŔ ÍË ŕ ËßÍ Í ŕ Źcheckbox Ë Úß ËÍÁß ˙ÁÍ ËÁß ˙ .ËÍÁË ŢÁË coupling ŕ ĹÁ ŕË áÍË ŕ view ß ÜË ÉÔ Ĺß ÜË áÎ ÁË ËÁß ˙ MVC .Ë˙ Ü Ăß áËÍÍ ÉÔ ÍË MVC ŹŢÁ Ëßß .ËË ÝÁ ˙ß ŕ ÁÍ view ß ŹÝéË Íééé ŕÁßË ŮÔ ÁÍ Í ŕ ĹÁ ŢÁ ˙ Ý ÍË Ţ ŘË ˙ééÔéé ÜË Í ŢßË ÁÍ Ŕ ˙Áß ß ŕËß ŘĚ ß ŕÁ ÁÍ ˙ÝÍ ŕÁ ŢßË ÜË ÉÔ áÎ ŕË ÍË ÁÍ ĹÁÍ ÝÁß˙ ÍßÔ .ÝË Í ˙ÁÍé ÁÍ ˙éÍé ÝÍé Ú ÎÁ ˙Í Ţ .Ý ÜÁ ŹËÍÁĚ Í I/O Í ÉÍé ÉéÁ ß ŕËß ŕÍĚ (áËÍ Ü ŕËÁË ŕ ÍË) ŕÍ Ůßé ÜÁ ÝÁ Î MVC ŘË .ÝË Í ÁÍ ŢŔ (ËË Ü ŢßË) ŹÝÍ .ËŔÍ ŢŔ ŕË ÎÁ ˙ß ŕ ËÁß ˙ Á ŹĹÁ ËË ËÍÍ Ô Í Üě ŕßéééééééé ÍË ŕééé ËéééËéééééé éééééé ËÁÍéééÁ ÎÁ ˙ééééééééé Ëßéß Üéé Á Üé ÁÎÁ Ë MVC grab the data and shove it into view Ţé ŹŢéÁ Ëßéß é ."˙ÍÁÎéÁ ÝÍé ĹÁÍÁË" ˙ Í ŕ .Ë ŕ ÁË é ÁÍ ˙ÁŕÍ ËÁß ˙ .Ë˙ Í Ü ÍË ˙ÁÎÁ Ţ ŕ ÝË ŕÍéßË éĹŔ ŢÁ Ý˙ Í Á .ËÎ ÁÎÁ ˙ĹŔ Ţ ß Ý ŕ ÍÁ ˙ .ĹÁ Ü Ë Í ˙ Í ÍË ŕ ˙ ŘÍ .Ë ŕË Á Ü .Ë ËÁß Ý ŕËÁ Ůß Đ ËË ÝÁ ÁÍ áÍ Ţ ËÁß ˙éÍÍé ĹéééŔ ŕËéé ÜË Ú ŕËË ÎÁ ÁÍ ËË ŘÍ Ü ËË ŕÎÁ ˙éÁÍéÔ ˙ÁÍ ŢŔ ÎÁ ŕ ˙Á ŕÎ ˙ Źŕ (ŕÁË) "ŕÎß" Ć .Ý ŕÍ Ú ŕß ˙ÁÍ ÍÁ .ĹÁ Ý Í ÁÍ˙ ˙ÁÍÔ ÍË ŹË˙ ŕË Á ÍË ĹéééŔ ŕËéé ÜË .ĹÁ áÍÁË Ţ ŕ ŕÎß ŹËß˙ áÍÁË ŕé ˙é ) Ĺ .Ëß˙ ÎÍ (ŕÔßÍ ŕÎß ÍË) ŕ ŘÍ Í ÁË Á ÍË Ëééé˙é áÎ ÜË ŕ ˙Áß ˙Ë Î ŢŔ (Ëß˙ ÜË Ĺ ŕ ÁË ŰéÍ ŕß ˙ÁÍ .Ë ŕ Áß Ëßß ŕ ŕ ŕ Ë ÍŐ Ë ˙ Íß ß ŃÁÍŔ Ý áÎ ÜË ÍË ß ŰÍ .Ë˙ áÎ ÜË ËÍ Đ ÍË ÁÍ ß .ËÍÁË Ĺß ÍË ß ß áÍÁË ŕ ŕÎß .ËÍ ˙ ÍÁÍ ŕß ËÍß ŕË Á Ü Ý ßË Í ÍË ŕ Ü Á Ü Î ËÍ Đ Ţ ˙ÁÍ Ń .ĹÁ ŢËÁË ÍË Ĺß ŹË ÍË .ÝË˙ ÍÁÍ ˙ÍÍ ËÍß ÁÍ ÍË ß ËÍ Ë áÍË áÍ ĹŔ ßË .ËÍéé˙é ÍéË Ń Ú (ËÍ) ŕ ĹÁ Đ Ú Ô Źŕ ˙ŕÎß ÍÁ ß ĹéÁ Ĺßéé ŢËÍÍ ŕß Á ËÍÁË ˙ Ĺ ŢÁÍË ß ŢÁËÍ ŕ ÍË Źŕ ˙ŕÎß Í ÍË .ËÍ˙ ÍÁÍ ˙ ˙Ĺ ÍË Á .Ëé˙ ÁÍÁË Î ÁÍ áÍË ˙Á Ĺ Á .ËÍÁË ÁÍ ËÍ Í Í ß Ĺ ŕé ÁË ˙Ĺß ĹÁ Ţ ŹĹÁ ŕË Ů ËÍ ÎÁ ŕ ÍË Đ Á ÍË ËÍ Ĺ ŢÁ ÍË .ĹÁ time-sheet Îß ŕ ŹŕÎß ÍË ËÍß ÍË .Ë Čé áËÍ ÍŐ ÎÁ ß ŹËË˙ ŕÎÁ ˙ß ŕ ÍË ß Ë˙ Í ÁÍ time-sheet ŢÁßé ŕ Áß ˙ ÍË ËÍ Ţ ÍÁ .ËŔ ËÁß Ëßß ŕ ˙ß ŕß ËééÁ ˙éééé ŹËßé Üß Ý ŕ ËÍ ŢÁß ŕ ĹßÁ ˙ ß ÍË ÍÁÍé ˙é ß ˙ ÍË Ü ÍßÔ ŕ ÍË ß ËÍ ŕÍ ŢßÍË .Ëß˙ ŕé .ËéÁŕËé ŘÍ ŹŕË ˙ß Ĺ ß Ĺ ŕß ÁÍÎ ŹËÍÁË Íéé ÍË ŹËéßé˙é ˙é ËÍ Ôß Ü ŢÁ ÍË ŕ ˙ ŕß .ËßÍ˙ Í ŕ áËÍÍ ˙ŕÍ ŕé Ôéé ß ËÍÁË ˙Áß ˙Ë ŕ ˙Áŕ ŢÁË ÁÍ˙ ŢÁÍÔ ŕÁ ŕ ŕé .Ëé ËÁß ÎÍ ŹËß˙ ÔßÍ Ţŕ ŕ ŕ ˙Áß ˙Ë ÎÁ ˙ ÍéÁ .Ýé ŕË Á Ĺß ŕ ˙ÁÍ ËÍ Đ ÎÁ ÝÁß ˙ ˙ Í Ýééé ß ÔßÍ Ĺ ß Ĺ ŕß ËÍÁË ÁÍ ˙ Ţ Ţ ß Ë .Ë ËÁß ŕÁß Ëéé ÍßŐ ŢÁ ˙ÁÍ żĹ ËË ŘÍ Đ ŹË˙ Í Ü Á Ü Î ÍÁ Ëé é Úé ˙ßÍŔ ŕ ÍÁ .Đ ÍË ŕ Ë ˙ß ŕÍ ŕÔÁÍ ÍË áÎé ŕË Ôß ß Ë ŕË ŕ ˙ÔÁÍ ÎÁ ˙ ŕ reference ÎÁ .Ëéé˙é Ü ŹËÍÁË Ëßß ŢŔ Đ ŕ ˙ Ŕ ˙ßÍ Í ŕ Ë ŹËß ˙éĹééŔ ŕ ËÍ˙ ÍÁÍ ŕË Á ËÍß ËË ŕ ĹÁ Ë ŢÁ ˙ ÍŐ .Ë ŕ ŕËß ËÍÁß ŹËÎéé ÁÍ Ëßé ÍÍ ÔÁÍ ËÁß ˙ ĹŔ ŕ ËÍÁË Íß ËÁÍÁ ÎÁ ˙ ËÍßé ŹËËéé Üéé Á Üéé Î Ú ŢÁß ŕ ĹÁß ˙ ˙ Ŕ Ţ ÁÍÎ ÁÍ ŕé éÍ Íé ŕé ŢŔ ÍË ĹééŔ ŕ ˙ÁŕÎ Ţß .ËÍ ÍÁÍ ŕË Á Ţééé ˙ÁÍ ÁÍ ˙ ÍÍ ÔÁÍ ËÁß ˙ ŕ ËË Ŕ .Ë˙ .Ë Í ˙ÁŕÎ Í ÍË ËÎ ˙ Ŕ ÇÍé ÍË ËÁß ˙ Ë ŕË ˙ÁÍÔ Ăß ŕ ˙ Ŕ ŕ ŕËÍ Ĺ Ţ ŕ ŕÍ Üéé ˙éßé ŕé ĹéŔ ÍÍ ÔÁÍ ˙ ŹËßÍ Í ŕ ŕ ŕÎß ÜÁË ß Óéé .ËÎéé ÁÍ ÍÍ ÔÁÍ ËÁß ˙ ĹŔ ŕ ÍË .Ëß ËÁß ˙ ÍéÎ áÎ ŕË ŕ ˙ Ë ŢÁ ŕ ˙Ë ) accessor ÍË encapsulation ŕéËé ĹéŔ Ĺ ŕ (Ë get/set ĹÍß ŕ ß Ë˙ ÝÁÍ ÁÍ ˙ Ăé Í Ţ ŕ Î Ĺ ˙ ŹËß ËÁß ÍÎ ÍÍ ÔÁÍ Źŕß .ËÎ˙ ÎÁ áÍéÎé ŢéÁ ŹËé ŕÍéÁ Íé éé ŕ ŕß .Ë ËÁß ŕËÁË Ţ .Ë˙ ÁÍ˙ ˙ ˙˙Ďß Í ŕÁÍ I/O Üé Í ËË ˙ŕß ÎÁ ˙ ŹËÍ ÝÁß Ć ŢŔ ŕÍÍË ŕ áÍÁÍ ŕé ÝÍ Í ˙ ß ŕË I/O Ĺß ˙ÁÍ ÍßĚ Í ŕÁÍ .Ë˙ ÉÍ ÁÍ ą° ˙éÔ ŕé ÁÍ ÝËßé ˙ ˙ÁÍÔ ˙ßÁ ÍßŐ ŢÁ ˙ÁÍ Ţ .Ë˙ Í ˙ß Íé ŕé ÝËééé "˙éÁÍ ÜÁßĎß" ÁÍ ŢŔ ß ŕËÍ Í ˙ß ŕ ŕ Ě Ü áÍééééééééé ˙ééééééé Ĺéé ˙ééÁÍé ÜÁßĎéß ˙ßééÁ .ÝÍé˙é .Ë˙ (CAP) Control/Abstraction/Presentation Ü ÍßÔ ŕ ßÁ .Ëß˙ Ř ŕ ŹËß˙ ÖÁÍ Á ŕ ˙ÁÍÔ ˙ßÁ Ú ŕé ÝÍÁË Úé Ţé .Ë ˙ ŕß Źŕ Ĺ Ü ˙ÁÍ Ř ŢÁÍÔ Ôß ÝËÍé Í ŕ ÝÍ ÍË Í ÁÍ ŢŔ ÁÍÎ ŹË ßÁ Ú "˙ÁÍ ÜÁßĎß" .ĹÁ Ă ˙ÁÍÔ Ć ˙ÁÍ ËÍ˙ ÍŐ ŕ ß ˙ÁÎ Á ŕ ˙éĹŔ ÎÁ ˙ßÍ - Ý ˙ ˙Ô ÜË ÁÍ PAC áÍÍË ˙ÁÎ Á ŕ Ţ .Ëééé˙é áÎé ÜËé Źŕ ŕÎß ÍË ÁÍ ÖÁÎ Á Ý Ý ÍßÔ ŕ ŕ Üéééé ß ŕÎ ËÁÍ Üß ŹË˙ ŘÍ ÁÍ ĹŔ ŢÁ ŕ ˙ ŹË ˙ "˙Í ˙ĹŔ" ÁÍ ÉÔ ŢÁ ˙ĹŔ ËÁÍÁ ĹßÁ ˙ .Ë ÍË Ôéé ŕé ĹéééÁ Í ÉÔÁ ŢÁ ÁÍÎ ÝË˙ ÁÍ ŢŔ Ţ ŕ Á ŕ .ĹÁ ÜË MVC ÍË "ÜË" ˙ÁÎ Á ŕ .ËÍÁË ËÍÍ áÍ ˙ß ŕÍ ŕěÁÍÁ ŕ ÍÁÍé ŕéěÁÍÁ ŕé ÍË ŹËéÍÁË ÁÍ Íé ˙ßÍ Í ÝÍ ŕŐß ŕ ˙ ÜéÍÁ ˙éÁÎé éÁ ŕé ÍË ÁÍ ÎÁ Ĺ Ë Ú ŢÁ .ËÍ˙ ˙éé˙ÁÍ Ŕ ÁÍÎ ŹÝÍ˙ ÍŐ ÍË ˙ÁÍ ÜÁßĎß ÁÍ Ŕ Ţ .Ë˙ Íé áÎ Ă Í ŕŐß ŕ ÜÍ ŕ .Ë ˙ÁÎ Á ŕ ˙ĹŔ ˙ÁÍ ŕ ÎÁ ÁÍ ˙ÁÍ ÜÁßĎß ŹËÍÁË ŕËÍ ÁÍ ÍÍ ˙ÁÍ ĹßÍ Ü ˙Áŕß ŕ ÜÍé éé ĹŔ ŕËË ÎÁ ˙ÁÍ ŢÁ .Ë˙ ĹÁßÍË ˙ÁÎ Á ˙ ÍÎ ÍŐ ÍË JComponent ˙ĹŔ ÁÍ Ŕ áÎ ŕË ÍË Ţ .Ë ËÍ .ËÍÁË Ëßß ÍË ŕ ßË ß ÜÍ ŕ Ţ áËß Č ŹÁĚ ÝÍ˙ éÁ ŹËÍÁË Ëßéß tight-coupling ŢŔ ˙ÁÍ ˙ ß ˙ÁÎ Á ŕ Đ Ţ é Ëéé ˙ÁÎ Á ŕ ˙ĹŔ .ËÍÁË ÍË áËß Č ˙ÁÍ ĹéŔ ŮÍÔ ÎÁ Ô ˙ÁÍ Ţ Ô ÍÁ Á ŹËÎ ÍÁÍÍ Ô ÍÁ ÍË ˙éééé ŕß ˙ÁÍ ) .Ëß˙ ÍÁÍÍ ( ŕ ÁÍ Ŕ ŕ) ˙ÁÎ Á ŕ .(Ë˙ ŢÍ ÜË ŕ ŕ ŕÁÍÁ ŕ ÎÁ " event-style ŕéěÁÍÁ ŕ Ţ Ô ÍÁ áÍÁÍÍ ˙ÁÍ ˙ ŕÁÍ "separable-model" áÍ .ĹÁ ˙ÁÎ Á ŕ ß Üéé ŹŢŔ ˙ßÍ Íé ÜË Ă ŢßË (View/Controller ) Swing_UI_Delegate é List_Model Ëéé) "Swing-Model" ĹŔ .ĹÁ ˙ÁÍ ÜÁßĎß ÎÁ ˙ß Íé ŕ ˙ÁÎ Á ĹŔ ŢßÍË Ĺ ÎÁ ˙ Ĺ áÎ ŕÍĚ ˙ÁÍ (Document .ĹÁ ˙ÁÎ Á ŕ Đ ÎÁ áË Áß ÍË ß ËßÍ˙ ˙ééÁÍ ÜÁßĎß ŕěÁÍÁ ŕ ŕ ÍË (JTextField JList) UI_Delegate UI Delegate ŢéÎ ŢŔ ÍË ß Ëß˙ ŕ ŹË˙ ĹÁßÍË ˙ÁÎ Á ŕ ÎÁ ÁÍ ÍË "éééé é ŕěÁÍÁ Ĺ ÍË ˙ÁÍ ĹÁÍ .ËËÍ˙ Ü ÜË ĹŔ ŕ ˙éÁÎ Á ŕ Ĺ ˙ÍÎßÍ ŕ Swing .Ë˙ ĐÁ Ź˙ÁÎ Á Ĺ ĹŔ Ĺé Ź˙ÁÎ Á ŕ ŹĹŔ ŕËË ÎÁ .ËÍÁË ŕß ÍÍ áËÍßÍß ŕ Ę ÍË ŢßÍ ÎÁ) Ë˙ Í ŹŕÔßÍ UI Delegate ÍÍ ŕÍß ŮÍÔ ÎÁ ÜË ŕËÁË Ţéé ÝÍé ß ËéÍÁË ˙éÍ Ë ÜË Ë ŕ ŕ ˙ ÍË ˙ Ë ŢËß ŹËÍéÍé é Ôéé Íé ĹÁÍéééé .(Ëééé Üéé ŢééééÔÁ ŹËß˙ ˙éÍÍé ÁÍ ĹéŔ Ĺ ŕ ˙thread ŕ ËË˙ ˙ßÍ swing event-loop thread áËËé Ĺ ÍË ÜË ĹŔ Ú ÍË ŢÎ Ĺ Ú ĹÁ Ţ Ţ .(Ë˙ ÁÍ ˙éÁÍ Á ÜË ÍË ŕË ËÁ Í Í ŕěÁÍÁ ŕ ÁĚ .ËŔ ÍË Ń ŕ .Ëß ËÁß Đ ß ŕË Á ˙ÁÍ ÜÁßĎß ŢÁß ŕ AWT ĹŔ ÎÁ ŕ ĹÁ ŢÁ ŕ Í ŕÁÍ listener ŢÁßé ŕ ÁÍ ˙ÁÎ Á ŕ ĹŔ ˙ßÍË Đ ˙ĹŔ ÎÁ ˙ Đ ŕËé Á ŢßË ß ˙ÁÍ ÎÁ " event ŹÁËË .ËÍ Í (ŕËß) ˙é ÁÍ ˙ÁÍ ÜÁßĎß .Ë˙ ŢÍ ˙ÁÎ Á ŕ ŕ MVC controller ÎÁ ßË ÍË ĹééÁ Ú ˙ :Ë Íß ŹËÎ˙ ÁÍ ŢŔ ŕ ˙ÁÎ Á ŕ ĹŔ ÎÁ .Ţ intergalactic Pan dimensional ˙éÁÎé éÁ ŕé ĹéééŔ .ĹÁ Ńß ˙ÁÍ (View) Ëéééé˙é ŢßÍ ÎÁ ŕŔ .áÎ Ă ŕ Ë Áß ÍË .Ë˙ ÎÁ ˙ééé ĹéË .Ëß˙ ŕěÁÍÁ Î Ă ŕ Ôß ŕ ĹÁ ˙ÁŕÁËß ĹÍ .ĹÁ ŕË Íß ŕ ÁÍ ˙ÁÍ ÜÁßĎß ą Ü .ĹÁ Î Ă ŕ ą Ü ![]() áÎ ŕË ŕÍÍË ˙Áŕ ŕé ĹéŔ Ţ áÍ tight coupling ß ĹÁ ˙ÁÎ Á ŕ ÎÁ ˙ ˙ÁÍ ŕËéé ÁÎé ˙ Ë ˙ÁÍ .ËÍÁË Ëßß ŢŔ ˙˙ÁÍ ß ˙ÁÎ Á ÁÍ Ĺéé Ú Ë˙ ĹÁß ÍË ˙ÁÍ ÎÁ ˙ÁÎ Á ŕ ĹŔ .Ëß˙ áÎ ˙éé ŹĹÁ ŕË render-yourself ˙Ď ÁÍ Á ŕ ÍË ÁĚ ŹË ÜÍÁ Ëßéßé .Ëéé ŕË ˙ ÍË ŕ ŃËß ÜÍÁ ˙ÁÍ ĹŔ ŕ ËÍÁË ËÍÍ employee ÎÁ ŢÁßé ˙é Üéé ˙ÁÍ ÍßĚ ˙Ď ÁÍ Á ÍË ŕ Ë ŕß ŹŢÁ ÜéÍÁ Ź˙ééÁÍé ÎÁ ŕË Á ŢßË ÁÍ Ý Ë Ëß Ĺ Ú Ô ŕ ĹÁß .Ë ŕ ÁÍ Đ ËÁß˙ ŕ ĹÁ Ý ËËÁ˙ Ü Á Ü ÁÎÁ ŕÍÍË ŕÍ ß Ëé ˙ßÎ ŹÍ ˙ßÍ Í ĹŔ ÍßŐ ŕß ŢËÁË Í ˙ÁÍ ˙Ë .ĹÁ reneder-yourself ˙Ď ÁÍ Á Ĺ ÎÁ ÍË ˙ ŢÁ ËééÁßé ˙ ˙Ô ÜË ˙ ŹĹÁ ˙ÁÎ Đ ˙ÁÍ ÜÁßĎß ŕěŔ ÎÁ .Ë ŕ ÁÍ ŢŔ ˙ĹŔ .Ëé ËÁß ÁË "˙Í " ˙ĹŔ áÎ ŕË ÎÁ view áÎ ŕË ŢÁÍ ŕé ŕ Ü Á ŢßË ŹÜ ÍßÔ ŕ ËÁß ˙ áÍ ˙˙ÁÍ Źevent Í ÍË ŢÁßé ŕ ËÁß ˙ Swing_JTextField ŕß ˙ÁÍ .Ëß áÎ ŕË ˙ÁÎ Á ËÍßé ŕËé ŕÍééĚ Document ĹŔ ÍË ŢŔ Ĺ ŕ ˙ÁÎ Á ŕ Ĺ ˙ÁÍ ÉéÔé ĹééŔ ËÍ ŕß ŕ JTextField ŢÁ Ëßß .ËÍ ÍÁÍ ŕË Á .Ĺ ŘÁß ˙ÁÎ Á áÎé ŕË ˙ÁÍ Í ˙ÁË ˙ ÎÁ ÝË˙ ÉÍ Ţ ŹÝ ŕ ÍßÔ ÎÁ ŕËéé éÁ ÁÍéÎ ŹŕËé Ůé éé ˙ Ý ŕË Á Ý ŕ ˙ÁÍ .Ë˙ ŢÁÍ ÁÍ Áß ÍË protected ŕé ˙é ééŔ ß ˙ÁÍ Ţ ËÁß Ô ŕ ÝÎ ˙ÔÁÍ ÝÁß˙ Áß ÍË ŕé ËéÁßé ˙ ˙ÁÍ ŢŔ ÁĚ ËßÍ Í ŕ Ë tight couple ß ËË˙ Ţ Ôéß ÁÍ Ë ŢÁ" ËÁß ˙ ŹÜÁŕËÁ Ĺ ÍË .Ëß ˙Ë ÍÁË É ÍßÔ ˙ß ŹĹ ˙ (C++ ) Áß ÍË Í ŢÁ Á "ËÁß ÁÍ Đ ŢŔ ˙Ë áÎé ŕËéé ˙éÁÎ Á ŕ Đ ˙ßÍË Đ ŢÁß ÁÍ ˙ÁÍ Đ ËÁß ˙ ŕé ËéÁß ˙ Í ˙ßÍ Đ ĹŔ Ă Í ŢË .Ë private ÁÍ ŢŔ ß ŕËß ˙ßÍË Đ private ˙Ń ŕ Í ˙ßÍ Đ ÁÍÎ) Ë ŕ ÁË ˙Í Ë Ë ÍéÁ .Ë ÁË ˙Í Ë Ŕ ŕ ËÁß ˙ áÍË ËÍ Č Á Ź(ËÍÁË ˙Í Ë ËééÁß ˙ ŕË Ů ˙ ÍË ŹË˙ ŕË Á ˙ßÍË Đ ˙Ď ÁÍ Á ÎÁ ÁÍéÎ Ýéß ÁÍ áÍ É Ë Ëß˙ Ă ĹËßË ŢÁ .Ë ŕ ˙ÁÍ ŕËÍ Ĺ Ţ ŕ ŕÍ .ÝË Í ÁÍ ˙ÁÍ Ń ŕß Ý Íß ÍË ˙é é ŹËéË˙é Ńééé ĹÍß Ţ ŕ ŕË Í ÁÍ ŃËß ŹĐ Í Ĺ ŕ ÁÍ ˙é Ĺ ËÁß ŕ Ýß ˙ÁÍ Ë ÁĚ ŹŘ ˙ŕÍ ŕËé Á Gang of four command ĹŔ ÎÁ Ë ÍßŐ ŢÁ ˙ÁÍ ß Ë ŕÍÁËÁ áËËé Ĺé ÎÁ ˙ ˙ÁÍ ÁÍ Number Format ÝÁß ˙ Ţ Źŕß ˙ÁÍ) .Ëß .(Ýß ˙ÁÍ ŕ ÁÍ áË ĹÍ ŕß ß Ý Í ˙ÁÍ ŕ ÜÍ ŕ ÍË éŔ Ă ß ÜË ÎÁ ˙ÁÍ ĹÁßÍË view ËÁ ÜÍ ĹŔ ŕŐß ˙ÁÍé ß Ëéé ˙ÁÎ Á ŕ ĹŔ Ú Ëß ËÁß ˙ ÜÍ ĹŔ .ĹÁ ßËß .(ĹÁ ˙ Î áÍ ŢÁ) Ëß ŕěÁÍÁ ˙ ÝÍ ÍË Ü .Ëéé Đ Ü MVC ÍË view ß ÜË áË ŕěÁÍÁ ß ˙ÁÎ Á ˙ŕ ŕé ĹéÁ ˙é ééŔ MVC ÍË Controller .ËÍÁË ˙ Ţ ÜÍ ĹŔ Á .Ëéé˙ Í ÜË Ĺ ˙Ý ŕ ÁÍ Ŕ ß ŕ Í ÁÍ view Ĺ ˙event ÎÁ ééé Ý .ĹÁ Ü Í Ý ŢÍ ŕÎ ÍË PAC ÜÍ ĹŔ ŕé ˙ßËß .ËßÍ˙ ŹËÎ˙ ÁÍ ˙ÁÍ ŕ ÜË Ĺ ĹŔ ŕ ˙ÁÍ ÜÁßĎß .Ëß˙ ÍÍË Ý ŢÍ ÍË ß Ëß˙ ŕ view ŢŔ ÍË áÎ ŕË - áÎ ÜË ŢéÁ .Ýéé˙ ÉÍ ÁÍ ŕË ß Ĺ Ý Ú ˙ÁÍ ÜÁßĎß áÍ Ţ ŕé ˙éé ˙ÁÍ) ËË˙ Ń ÁÍ ˙ÁÍ ŕ ËÎ˙ ŕË ÝÍ Ú Ý .ËÍÁË ÍÁÍ ÝÍ ÍË ˙ Ü ÍË ˙ÁÍ .(ËË˙ Ţ ÁÍ ÜË Ĺ Ĺ .ĹÁ Ô ÍÁ ÍË Áß UI Layout Manager ŕß ŕ Á ŕËééÍß ŕ ł ß ˛ Ü ÍË ß ß Á ÜË ˙ÍÁËß ÍË ÝÍ Ý ÔéÁÍ User Interface éééÁ ÍË .ĹÁ ŕËŔ ˛ Ü ÍË Á ÜË .ĹÁ ŕË User Interface Ë ˙ ŹËß ŕËÁË Ţ Í ÍË ŕŔ ˙ÁÍ .ĹÁ ˙Á ˙ÁÍé ÁÍ é˙ééÁÍ ÜÁßĎß ŹŢŔ ĹÁßÍË Ý ÍË ß ŕËß áÎ ŕË ÁÍ ÁÍ JComponent ŕé ˙éé Íé ÎÁ ˙Áŕéß ĹÍß ˙ÁÍ .Ë ŕ Ĺ .Ëß˙ ŕËÁËÍ Î ŹË˙ áÎ ŕË ˛ Ü ![]() ÎÁ é˙ééÁÍé ĹéÁßéÍË ŢŔ ŕéŐß .ĹÁ PAC Control ĹŔ Ú Form Đ ÝÍé .Ëéé˙ Í ˙ßÍÍ ˙ÁÍ áÎ Ă Í ß Ń Ü ˙ĹŔ ŕé ˙ ÝÍ ÎÁ Î ĹÍß ÍË ËÁß ˙ ĹŔ ÁĚ ŹËË˙ Ô ÁÍ JComponent ˙ßééÁ ÝÍé-ŢßÍË-ĹéÍé ŕßéé ŢéÁ) Ëéé ŕËéé éÁ ˙ééÁÍé ŢÁß .(ĹÁ Gang of Four Composite ËééŔ˙ ÍË Ń ŕ ÝÍ ˙ßÍÍ ŕ áËË ˙ĹŔ Ĺ ˙ËÍ ˙ÁÍ ÝÍ String ŹElement .Ëéé˙é ŕËéé éÁ (Private ˙ééÁË Đ) Elements ÎÁ Ë ŕß .ËÍÁË˙ ŕ ŹË˙ ˙ ÁÍ Ĺ ˙Á ß Đ ŕ (˙ŕ Í) ˙é éÍË ŕé ÁÍ ÍééÁ ÉÁÍÔ ÍÁ .Ëß˙ ŕÍĚ (Ë Ý ŕ) Ĺ Ý ŕ ŕËéé ËéßÍ ˙Ô ÍË Ë ŕ Ë˙ Í Đ ŕß Ĺ ŹËË ÝÁ .Ë˙ Í áÎ Ýé is invariant) invariant :Ëßé˙é ˙é Element ĹŔ Öß ßË ÎÁ .éicon ß slabel Ëééé Ëéé˙é Ĺ ÝÍ Ń Ý ŕ (ĹÁ ĹÍË ÁËé invariant Í .Ë invarian icon ß label Ë ˙Î ÝÍé ÍË add field(invariant: JComponnet, location:Rectangle) Ëé ŢËÍ Ţé Element ŕËÎÎÁ ŕË Á ) ÁÍ Ă Element ŕ ËÍ˙ ÍÁÍ .Ëééé˙é ŕ Ë Ĺ ŕ ÁÍÁ ß ŕ (add field() ˙ŢßÍÁ ŕËé Ţééé Ü ÍË invariant JComponent ˙ ŹËËÍ˙ Ü ÝÍ ŕ .Ëß˙ ŕËÁË Ń ß ŕ Í ÍÁÍ Ĺ ÎÁ ˙ Í Ë invariant ŕ ˙Ë ŕ ŕ ĹÁ Í ÓÍ ŕé add-field ˙éŕéé Í Ú Ë ŢÁ .Ë˙ ÎÁ ˙ .ËÍÁË˙ ŕ ÁÍ Ĺ Ý ß Đ Ý ŕ ˙ŕ Í ĹÍßé ŕ ŕ .Ëß˙ ŕÍĚ ŕ Í ĹÍß ŕ Ĺ ˙Á ß Đ ŕ Ë ŕß ŕé ÁÍ ÝÍé ŘéÍé Źŕ Í ËÍÍ .instantiated ˙ĹŔ ŕ reference ŕé Î ÝÍ ÉÁ .Ë˙ ŢŔ ŕËÁË ŕ ÍË ˙ßË ASCII Ü ĹÍß .Ĺ ËË Ü ŕ Î ß ËÍ˙ ÝÁ ASCII Ü ŢÁ ÉÁ ˙Ë layout ËÁß ˙ .ĹÁ ÜË ÎÁ view áÎÁË ˙Á Ń áÍĚ ŘÔÁ ŢÁ ÜËé Íé ĹéééÁ .ËË Í ˙ß Ë ŕ Î ŢßË ÁÍ ÝÍ ĂÍ ß .ĹÁĚ ËÁß Í Load() ˙éË ÝÍ ÍË Ü ÎÁ Elements áÍÁĚÍ ˙ÁÍ Form Đ ÍË Hooks ËÍßé Úé Îé ŕé ß Ë non-final ˙Ë Ŕ .Ëß˙ ŕ store() ß ˙éééé ˙ÁÍ ÁÍ Ŕ ËÁß ˙ .ËË˙ ÝÁ áÍ Ź Á Ţé ŕß ˙ÁÍ .Ë ˙Í (Form ÎÁ ˙ Ů Á Ôß ) ÝÍ ŘÍ Ý ˙éÍé Load() Ë :Ë˙ áÎ ŕË ÍÎ ĹÍß ŕ ÁÍ Ë ßË ŕ ÝÍÁË ˙ ŹËéÁŕËé ÁË ÍË ÎÁ ŢÁ Í ŕ ASCII Ü Ú ŢËÁß ÁÍ ÍË ß Element Úé ÍË ÁÍ ÍéÔé Í ŕ Ă Í ŢË Ë˙ initialize ÁÍ Form :Ë˙ ˙Ë ÍÁË ÍÎ ÍÎ Ă x, y, width, height, class_name, attribute_name Đé Ýééé ŕ ˙package Ý) Ëß ÔÁÍ ÎÁÍÁ ÜÍßÔ ŕ Ë Đ Ý ß ËËÍ Ň class name Ë ÍË ËÁß ˙ java.swing ŕ ÍË Đ Í .(ĹÁ ŢŔ ŢéßÍŔ ŢÁß attribute_name Ë .ËÍÁË string constructor Ú Đ é ß ÖßÍé < Í ÁÍ attributed-name ÍÁ .ËßÍ˙ Í ŕ constructor .Ëé˙ URL Ú attribute name ŕ ĹÁ ŢÁ Í ÓÍ ŹË ŕ > Í ÁÍ Á ŹËß˙ ŕ ImageIcon ŹË javax.swing.ImageIcon Źclass-name ÍÁ .ËÍ˙ ÍÁÍ JLabel ŢßÍË ŢÍ ˙ËßÍß ŹÜ ˙ÁÍ 10,20,100,200,javax.swing.JButton,Hello World :ËËÍ˙ ÜË ÍÎ Ü ŕ new Element(new Rectangle(x,y,width,height), new JButton("Hello World")); :Ëß˙ ËÁ ÍÎ ŢÍ ŢßÁ ß 10,20,100,200,java.swing.ImageIcon,foo.gif :ËÍ˙ ÍÁÍ ÍÎ Ă ÍË ŕnew Element(new Rectangle(x,y,width,height), new JLabel(new ImageIcon("foo.gif")); ß<http://www.holub.com/images/mooney.jpg> 10,20,100,200,java.swing.ImageIcon, ŕ ÜËnew Element(new Rectangle(x,y,width,height), new Element(new JLabel(new ImageIcon(new URL("http://www.holub.com/images/mooney.jpg") ))); .Ëß˙ ÝÍé Ńééé ˙ÁÍé ÁÍ ÍË ŢÁ ËÍ ŕß ËË ŕÎÁ ÚÁ ŘéÍéé ) ÝÍ áÎ Ň .ËÍÁË Ëßß ß ÜË ÍË ßÍ ßË .Ý ˙ÍÍ .(ŢÁ Ń ß ÝÍ ŕ ÁÍÁ ŢÎ ˙ĹŔ ŢËÍ ŕ) áÎ Ü ß (Ë add_field() Ëé Ë Ú ËÁß ˙ ß "ĹÁ ŢŔ áÎ Ň" ŕěŔ ÎÁ ÍË UML ˙éß ÜË ÍÁËß .ÝÎÁËÍ˙ áÎ Ü ˙ßÍ ŕ ŹËÎ ÁË ÁÍ ËéËéË ÁÍ áÍÁËß Ţ ÍÁ .ËË˙ Ţ ÁÍ áÎ Ü ËÁÍ ł Ü .ËééË˙é Ţé ÁÍÁ ŢÎ ÍË ÁÍ Ý ˙ĹŔ ŹŢß ŕ Ëě ŕß (Ńé Ĺ ÍË) ÍË ĹŔ ŕ ˙ Ŕ ÎÁ ŕ ĹÁ ˙ Í ˙Á ÔßÔ .Ëß˙ ÜÍÁ ˙ ˙ ÎÁ Ń ŹÍÁËß ˙ ˙Ý .Ëß˙ ÜÍÁ PAC ˙ß ÜË : ł Ü ![]() .Ëé Í˙ ÍŐ ÍË Ë ÁÍ Form ĹŔ Ţ ˙ßÍ ÎÁ ˙ ÍË ééé Element ĹéééŔ é Form--already Í ÖßÍ ŕÔ ÁĚ Ëß˙ ÎŔ ˙ÁÎ Á Ĺ ÜÍ ĹŔ áÎ Ü ËÁÍ .Ëß˙ ŕ ÍÍŐ attach(things) Ýéé ĹÍß ŕ) Ë˙ ÜÍÁ ÁÍ ˙ Populated Form ß ŕé ˙ĹŔ Ź"Ń Ü" ĹŔ Ë Ú ŕ Ĺ ŢÁ ŕ things .( ÁÍ ˙ééÁÍ ÜÁßĎß Î Ý ÍË ß Ë˙ áÎ ŕË ÁÍ user interface ËË Ĺ ÝÍ ŢŔ ĐÁ Í ŕ ĹÁ ˙ ÁßÍË attach() Ý .ËÁËÍ˙ Î Element ËÍéé ˙ĹŔ ŕß Ĺ ŮË ŕß .ËË˙ Ń ÁÍ ĹŔ .Ëß˙ ÜÍ ÁÍ attach() ÎÁ Ĺéé ŕé Form ˙éĹéééŔ .ÝéËÍ˙ Î Á ÜË ŕ ŕé ˙éßé ß ŕÁÍŔ ˙ÁÍ ˙ßË ŹËÍ ˙ĹŔ ˙ÁÍ ˙ .Ë˙ ˙ ˙éË ÍÁËéé écollection Map ÎÁ ˙ Ń ˙ÁÍ .Iterator ĹÍß Ź FORM ÍË ÇÍé ÎÁ éĹééŔ ŢŔ ÍË ŕ ÝËß ŕË Á ˙Ë ÎÁ Ţ .Ëß˙ .ËéÎ˙ Ü Form ŕ ÁÍ ÜË Ĺ ˙ĹŔ ß (PUSH ÜË) Ëß˙ "PUSH" ŕËéé .Ëé˙ ÇÁÍ Á ÜË ÎÁ ÁÍ Î ËÍß ˙ĹŔ FORM ŹPULL ÜË ÍË .ĹÁ Í ÍÁßË PUSH ÜË ŕ ÍË ÜË ŢÁ áÎ Ăéé Í ŕ ÁÍ ŢŔ ŕ Ë˙ ˙ Form ŹËß˙ ŕ ÝÍ ŕ ˙ Ŕ ŕ Ţé ÁÍ ŕË ŕ ĹŔ Đ Ĺ ˙element ÍÁ .Ë ŕ element Í ŕ ˙ÁÍé Element ÍË attach() ŕééé .Ëßé˙ ÍŐ ŘÍ ĹÁßÍË ŢÁ ÎÁ ŹËË Ýé Element .ËÍéé˙ Ý ŹŃ Ü ĹŔ ŢËÍ Í ŢËÍÍ Ţ Element ÍË ŕË ŕÍĚ Đ Ý Đ Ý ÍÁ ß ŕ Í ÁÍ ĹŔ Đ ĹéÍ ( Ĺ ) Ĺ ˙ÁÍ ˙ÁÍ ÜÁßĎß Ú displayable ĹŔ ÎÁ ŹË ÜéÍÁ é Ĺé ŕ Ë ŕß .Ë˙ ĹÁßÍË Element Ĺ Ë ÍË ŕË áÎé ÁËé ß "elbayalpsid" ĹéŔ ŕ ŹË˙ ŕÍĚ ÁÍ Ĺ Ý ŕ ˙Áŕ Í .Ëß˙ ĹÁßÍË áÎ ŕË ÎÁ element ÉÍ ĹÁ Ĺ Í ŕ ËÎ˙ ˙JComponent "displayable"Ź ĹŔ ĹÁ ÍË ÁÍéŔ ŢÁßé ˙é component ÉéÁ Ý ÍË ÁĚ ŹËß˙ Ü component ŕ ß ŢŔ ŹÝËß ŕÍÁ Í ŕ ŕß .ËÁËÍ Î ÁÍ component Đ ß ŹĹ ÁÍ widget Đéé ß ŕËß Ă ÁÍ ˙ ÜË Źŕ ÁÍ Swing_widget ËÁß ˙ ŹËß˙ ŕ visual-proxy() ĹÁßÍË ŕ ˙ÁÍ ĹŔ Đ .ËÁËÍ Î .ËËÍ˙ ŕÍĚ Element ŢßÍË ˙ééÁÍé ÜÁßĎéß Ëééé ˙ Element ÍË ŕË ŕÍĚ Ý Đ Ý ÍÁ ˙invariant ˙ Element ß Ë null ˙ÁÍ Ë ÍÁ .Ëß˙ ĹÁßÍË ŹŕË ŕ ˙Î ŕ ŕ ˙ÁÍ ŹËË Ţ ÁÍ (ŕÍ ß icon..label Ë) Element constructor ŹË ŕËß invariant ĹŔ ÍÁ) Ëß˙ ŕÁ ÝÍ ŕ .ĹÁ ŕËßÎÁ ÝÍ ŕ ÁÍ ŢŔ ÜÍ ĹŔ ŹËß ÜÍÁ ÝÍ ŕ "displayable" ˙ĹŔ ŕ ŕÁ Ó ŕ .ËÎé˙ Ü setVisible(true) invalidate() ĹÁßÍË ÜÍÁ ÁÍ ÝÍ ééé Đ Á .Ëß˙ ÜÍÁ Form ÎÁ Component_base Đ ŕ ĹÁßÍË ŢÁ Íé ŕé ÁÍ activate() ˙éÝé do-layout() .Ë˙ ÍË ÁÍ do-layout() ŕ SetBounds() ß SetVisible() ˙ĹÁßÍË ß ŕËß ÜÍÁ form ÎÁ element ÁĚé ŹËéÍßŔ ÍË Ń ŕ ÁÍ Ëß Ŕ Ëß˙ ŕË Í ŕÔßÍ ˙˙ÁÍ ŕé ˙ééé ÍéÎ "displayable" ˙éĹéŔ ß ĹÁ ĹßÍ Ü ÝÍ ÚÁ ŕé Ë ŕß .ËÎ˙ ÍÁÍÍ Ô ÍÁ ËËß ŕ ÝÍ ˙ÁÍ ÁÍ ˙ÁÍ ĹéŔ .Ë˙ ŢÍ "displayable" Î ŕ ˙ÁÍ ÎÁ ÍÍ áËßÍß ŕËé ŕß ŕ ÁÎÁ ŢÁ ÎÁ Ú Ţ .ËÍÁË ĹÍ Ô ÍÁ ŢÁ ÍË Form ÉéÔé ˙éĹéééŔ ÎÁ ŕËÁË ÇÁÍ Á ˙ÁÍ .ËÍÁË áÍ ŕÔßÍ Ĺ áÎ "set" Ëé é Čé ÎÁ ĹŔ Ĺß ÉÁ ˙ÁÍ ß "get" Ë Č ÎÁ ˙ÁÎ Á ŕËß ŕ Swing JComponent ŕ ˙ÔÁÍ ŮÍÔ ÎÁ Í ŕ .Ë˙ ŕË Á Ý ŘĚ ß ŕÁ ÁÍ Ë ŹÝË Í ÁÍ ÝÍ ÝÁß ˙ Ţ .ËÍ˙ ÝÁ ŕÁ Ë ŕ ÁË Í ˙ÁÎ Á ŕ ˙ Í ŕÁ ŢßË ÁÍ ˙ÝÍ ÍßéÔé .Ë ËÁß ĹÁÍ ÝÁ ŕß ĹÁ ÍË .Ý ŘĚ ˙é Íéé ŢÁ ŕ ÝÍ ŹÝË Í ÁÍ ˙ ÍÎ ÜË áÎ ŕË Ţ ÍÁ ŕ Đ ˙ßÍË Đ ŢÁß ŕ ß ˙ÁÍ ŕěŔ ÎÁ ŕß .ËÍ ËÁß Đé Ú ˙ÁÍ (ŕěÁÍÁ ß áÎ ŕË) ĹÁÍ ŕ Ëß˙ áÎ ŕË ˙ÁÎ Á ËÍßé Đé ŕ reference ŕ ˙ÁÍ ŕ Ĺ áÎ ß ËÍ˙ ĹÍß Ü Ú ÍË ßé ÁÍ áËÍÍ ŕÍ Ý ŹË É ËÍ ÎÁ ŢÔÁ Üß ˙ÁÍ ÍŐ .Ĺ Í Ü Đ ß Ĺ ˙Á ŹÝ ŕééěŔ ÎÁ .Ë˙ Gang of Four ˙ÁÍÔ ˙ßÁ ÎÁ ˙ ˙ÁÍ Áß ÍË áÎé ŕËéé ŕÍ ÍË ß ˙ÁÍ .Ëß˙ ŕ ÜË Ĺ ĹŔ Ôß ˙ÁÍ ŕËéé ŕ ĹÁ ˙ ÍË encapsulation ˙ Í ŕ Ĺ ŕË Á Ü ĹŔ ŕé ééÁ .Ëéé Í ÇÍ ˙Ë ÖÔÁ ŢßË ËÁß ˙ ÜË Ĺ ĹŔ áÎ ŕß ÍÁ Á .ËË˙ Ţ Ë ŕ Í ĹÍß ŕ ŕ ˙ Ý ŹĹ ŕß Íé ÍË .ĹéÁ ŕé ÁË ÜÁ ŕßÁ ˙ÁÍÔ ŕ Ĺ ŢÁ ŕ ŹË Í Ĺ Ëßéß ŕé ˙ ŕ ËÁß ˙ ĹŔ ß ĹÁ non-issue Ĺ ŢËßÎÁ event ÁÍ éÔé ˙éË ŕ ËÁß ˙ Ă Í ŢË .ËÁËÍÎ null Ë ĹÁßÍË ËÍÁË .ËÁË Ň áÎ ŕË User Interface Đ Źą Ĺ .ÝÁËÍ áÎ ŕË Ć ŕ ËË ŕÎÁ ÚÁ ÜÁßĎß ËÁß ˙ ŕ ˙ĹŔ) Ëß áÎ ŕË ĹŔ Ôß Ë ŕ ÁÍ ˙ ŕé ÔßÍ string ŕ ËÍÁË Ë Ú Ë ÔÁÍ .Ë˙ ŘÍ (ËÎ ˙ÁÍ ŕ ËÁËÍ˙ Î JComponent Ú Ë ŢÁ .Ë˙ ÜÍÁ ÁÍ ÍŐ ËÍß Ĺ Ý ŢŔ ŕ ˙ Ŕ ŕ ˙ÁÍ ŕ ĹÁ ŢÁ Í ÓÍ .ËßÍ˙ Í ŕ ˙ÁÍ ŢÁß ŕ ÍÁÍéÍ Ô ÍÁ ÍË ËÁß ˙ ĹŔ ßË ÁĚ) Ë ËÁß Ü ŕ ÁÍ (ËÎ java.user-interface : ą Ĺ ÁÍ (ŕéÔßéÍé Form Đ ËÍÍ ß) user interface áÎ ŕË ŕß ˛ Ĺ ˙ÁÍé ŕé ÁÍ Form ˙éé ĹŔ Ú (ą´ Ô) ÝÍ static Í .ËË˙ Ţ static Ĺéé ß ËéË˙ ÖÍÁ ŹËßÍ˙ Í ŕ Employee ˙ĹŔ ˙Ë ÍÁË ŕé Ř ˙ĹŔ ˙Ë ÍÁË ˙ÁÍ Í ŢË ËÁß ˙ ÝÍ Ţ ÁÍÎ ËÍÁË ŢééßÁ .Ëéé˙ ŘÍ ÁÍ ÝÍ ˙Ë static-initializer Úß .ËßÍ Í Name ŕé Í ŕ ˙Í .Ë˙ ŕÁ ÁÍ invariant Ë add-field ˙ÁßÁÍ ĹéŔ Ĺ ŕ Ŕ .Ë Ţ ŕÁÍ invariant ˙Ë Ë˙ ŕÍĚ ÁÍ ŕ ÝÍ ˙ Ä Ĺ ÍË ŕĎß label ŢÁ .Ë ÝÍ Ĺ Ŕ .Ëß˙ Ü ŕéß ÍË ÁÍ ÎÍ Ü ą° ÍËß ÍßÔ ŕ ÝÍ) ËÍÁË ÍÁÍ Ü ˇľx˛° ĹÍß Íééé (10 ß 10) ŕ ÍËß ÍßÔ ŕ (0 ß 0 ) Ĺ :ËÍ˙ ÍŐ ÍË ÝÍ ˙éÁßÁÍ ŢÁ .Ë˙ Ň Á ˙ÁÍ ŕ ˙ ÍßĚ Ë ˛° Ô ÍË ß Ëß˙ ŕé ÁÍ ˙é ß Đ Ý JComponent ÜÍÁ ˙ ŕ ĹÁ ˙ Ë ŕ Í .ÝËß Ň Ë ËÁß ŕËÁË Ń ŕéß ŕ ÝÍ Ń Ý ÍË ŕ ĹÁ (łľ Ô) visual-proxy() Ë áË Ń Źsalary Ĺéé ßË Ëé˙ ŕË ŕ ŕß .Ëß˙ ˙ÁßÁÍ Form ĹŔ ĹÍß ŕ Jlable ÁĚ ËÍÁË ˙ËÁß Ô Ĺ salary ˙ÁÍ .Ë˙ ÁÍ Name ĹéÁ ŢÁ ÝË ÁÍÎ ŹĹÁ Í ŕË ˙ name Ĺ .Ëß˙ ŕËÁËÍÎ ˙ÁÍ ÁÍ swing Í ˙ ŕß Á ÍË .ËË Í ÁÍ name ËÁß ÝÍ ÍÍ ŕ é ŕé ĹÁ PlainDocument ĹŔ name Ĺ ŕ ÔßÍ ˙ÁË ÍÁË .ÝËÎÍ ĹéŔ .ĹÁ swing Î ËÍß model Î ŢÁ .Ëß˙ reference (ł˛ Ô) name ˙é éß .Ëß˙ ŕ ÜË ŕ ß ŕ ´ł Ô ÍË JTextField Ź"presentation" ŕ Ý Ôß ŕÔßÍ PlainDocument ĹŔ ËË˙ Í ÁÍ Ţ Ë ÍÍ .ÝÁß ÁÍ ŢŔ ÝÁß ˙ ß Ëß˙ ˙Í ÎßÍ constructor ÍË ÁÍ ÝÍé Employee ĹéŔ .ĹÁ ÝÍ Ĺ ËÁÍ áË ŕÍ ˙Ďé ÁÍ Á ŢÁ .Ë˙ ˙Ë ÍÁË ÁÍ ŃËß Employee ĹŔ ˙ ŹËÎ˙ Ëß .ĹéÁ ÜßÁËé ÁÍ˙ Ý ÍË ÍÍ ŕÍß ˙ÁÍ (Ëß ˙Ë ÍÁË ˙) ŕ ŹËÎ dialog (Constructor ˙ÁßÁÍ ÍË) ÎËÍß ĹÔÁ Ă ˙ÁÍ Ăéé Íé ŢéËé .Ëé Ă ÁÍ Î ËÍß ĹÔÁ ËÁß Constructor ÎÁ .ËË Í ˙Ë ŕ ÁÍ ˙Ë ÍÁË ÝÍ ÝßÎ ĹÍß ÍË ËÁß ˙ ŢéÁ .(śś Ô) Ë˙ ŕ Constructor ˙ ÍË ÝÍ ŕ ÁÍ Ëß ˙ ĹŔ ŹĹéÍË Ĺéé ÍË Ŕ Ă ß Ĺ ßË ĹÍË ˙ÁÍ Form Ëß˙ Ă Ĺ é ËéÁßé˙ ÁÍ ÁÍ hook Ë Constructor Đ Ë ĹÁßÍË ˙ÁÍ ÝÍ Ĺéé ĹééééÁ ÍË .(¸ľ Ô) ËÎ ÁÍ create_intialization_Form(...) .Ëß˙ ˙Ë ÍÁË Î derived-class base-class ÝÍé ˙ßé ÚéÁ ŕ) ĹÁ derived-class ŕË ŕËÁËÍÎ ÍÁË .Ëß˙ ŕËÁËÍ Î ŢŔ ŢßÍŔ Ô ÓÍ Ń áÎ ŕË ÍË (Ë˙ ŢŔ ŢËßéé ß ÝÍé ŢËßéé ŕÍĚ ˙ÁÍ ˙Frame ŹEmployee Constructor ÚÁ ŹWait_for_close() (ÝÎéé JDialog ŹJfame ˙ ŕ Ý Áß ˙ Ţ) .ËÎ˙ ŕé ééÁ .ËË ÁÍ ÝÍ ÍÍ ËÍßÁ˙ ÍË Ů Ĺ ŕ ÁÍ ˙ thread Úéé é ß thread Ĺé ËÁß ˙ modless ÝÍ .Ë ÍŐ Ĺ ÝÎ ÍéŐé é ÍÁ ŕ Ë ŕ ÁË Ë ŕ .Ë ˙ ĹßÍ Ü ŕÔßÍ ÍË ÁÍ Employee ŕé "main" ß Swing ˙éËÁËéÍ ŃÎÁËÍé Źthread ßË Ëééé ĹË ŹË˙ ŕË Á ˙Ď ÁÍ Á ŢÁ ÎÁ ÍÁ ÁĚ .Ëß ËÁß Ü Ź ËÎ˙ .Ë Employee.java :˛ Ĺ ˙ÁÍé ÝÍé aggregation ŕéÔéÁÍ .Ëßé˙é áÎé ŕË ´ Ĺ ÍË form Đ ŕé ÁÍ Ô ÍÁ ŢÁ Ţ .Ëß˙ Í (˛´ Ô) Ë Ţß ŕ ŢŔ ˙Ë reference Źcollection ŕ ŕěŔ ÎÁ Á .ÝËß áÎ ŕË vector ĹÍß Ëé Íé ŕ áÍË ˙ÁŕËÁË Í ÁÍ vector ŕËŔ ÍË ÝÁß ˙ Ţ ŹËß˙ ˙éĹéééŔ ËéÁß ˙ ÝÍ ŕ ĹÁ Í ÓÍ) Ý ŢÎ ŹËÍÁĚ Í ÎÁ ˙éévector ˙ßé ß Ëéé ˙éËééÎ hash ÜßË ÍË ÁÍ Ëß Element ÍéÁ ŕÁ ÜË .ËË˙ Ń ÁÍ ÍŐ ËÍß Đ Ĺ ŕ Ë Element .(Ëß ËÁß Í ŢÁË ˙ŔÍ Ëß ËÍÁË ˙ ˙Ë ÝÍ ŕé ÁÍéŔ Ţ .Ë˙ ŘÍ ÁÍ ÝÍ ˙Í ŕß ŢßÁÍ ˙ (ł° Ô) INSET ŕÎÁËÁ .Ý˙ áÎ ŕË ˙ Ë ĹÍß ŕ EmptyBorder ĹŔ ÎÁ ŕË Á ˙ ŮéÍéÔ ÎÁ ß Ëßé˙é ŕÍééĚ (łą Ôé) preferred_size ÍË ÝÍé ÍéŐé ËÍß Ëéé é .ĹéÁ ˙ééé éË Üéé getPreferredSize() ß getMinimiumSize() ŕÁ ÝÍ ŕ áËË Ë ŕ ÍË (łś Ô) update_preferred_Size(...) ÍË ß ÜéÍÁ ÁÍ ŕËé ŕËßÎéÁ Ë Ü Ë ŢÁ .Ë ËÁß ˙ÁßÁÍ ŹËß˙ .Ë˙ ˙ÍÎßÍ ŕ ÁÍ ŕÎÁËÁ ÝßÎ ĹÍß Frame éé ŕ ˙ ÍË ÁÍ Ancestor listener (´ľ Ô) Form Constractor ŕËß Ă Ţ ˙ÁÍ .Ë˙ ÝŐ Ë˙ Í ŢŔ ŕÎÁËÁ Ëß˙ Řß ˙éÁßéÁÍé ÍË ŕé ÁÍ ˙ééthread ÝéÁßé ˙é ÁĚ ÝÁË ÁÍ Řß ŢÎ Ëé é ß wait() Ëé é ŢéÁ .Ýéé Íéé ŹË ÍŐ wait-for-close() .Ë˙ encapsulate ÁÍ notifyAll() Ź(ą˛° Ô) release() ß ŹËéËé ŕËßÎéÁ swing ŕé ÍéË ˙ ŕß ŕÍ ÍË Ancestor listener ÎÁ ł Ĺééé ÍË ÁĚé .ËÍÁËé Ëßß AncestorAdapter ˙ÁÍ ˙Ë ŕ .ÝËß ŕË Á AncestorAdapter AncestorAdapter.java :ł Ĺ ŕé ééŔ ŕéé .ËéßÍ˙é Íé ŕé ŢéÁ ÎÁ Đé ŕéééé Ř ˙Ë ÍË iterator Ú ÎÁ Ë ŢÁ .Ëß˙ ŕ (ˇˇ Ô) attach(user-interface) ŕé ŕ ˙ Ŕ ŕ ËÁß˙ Ë Í ÎÁ Ă Í ŕ ß Ë˙ ŕË Á Ë ŹElement ˙éßÍË Đé ÍË attach ˙éÁßéÁÍé .Ëßé ŕ ŕË ŕÁ ˙Î ŕé ˙é Íß ÍË ÁÍ ˙ÁÍ ÜÁßĎß ß ËÍ˙ ĹÍß ß ÜË ŮÔ (attach(...) .Ëéé˙é ĹÁßÍË Ë ˙ ŕË ŕÍĚ Element ÍË ŕ ˙ Ý Đ Ý .Ëß˙ ŕÁ ÝÍ ŕ ˙ÁÍ Đ ÁÍé swing é ŕé ĹéÁ (ą°´ Ôé) dolayout() ŕ ÔßÍ áÎ ŕË ŢÍŔ ÁÍ Ëéé Í Ă Í ŕ ß ËÍ˙ ĹÍß Ë ÍË áÎ ŕË .Ëß˙ ŕËÁß ĹÍß (ą¸˛ Ô) activate() Ë Element ÍË ˙Áß áÎ Ü .Ë˙ Ü ĹÍË ˙ÁÍ ÁÍ SetBounds(Location) ß SetVisbible(true) Ë ŢÁ .ËÍ˙ ŕß .ËÁß ˙ ÁÍ Ă Ü ÍË ˙ÁÍ ŢËÍ Î ß ŕË ŕ ˙ÁÍ Úé ĹÍßé ŕé ˙éËé ŕé ÁÍ Ýé ŢÁ ËÁß ˙ ŹÝËß ŕÍÁ Í ŕ ŃßÍ ŢÁ Ź˙Í ŢË ˙ÁÍ Ţ Á .Ë áÎ ŕË Layout_Manager .ÝËÍ Ă Á ÁÍ AncestorListener ŕé ˙ééé .ÝËÍ ŕË Á ˙ÁÍ ˙Í ÎßÍ ŕ ˙ÁÍ Listener ÎÁ Ţ Üé Á ŹË˙ Í Í Listener ŢÁß ŕ ÁÍ Ëß ÜË Ĺ ĹŔ ˙ÁÍ ÎÁ ŕéßéé ˙ÁÍé) subscriber ĹéŔ ŕ publisher ÎÁ reference ŕ ËÍÁË ŕéé ÁÍ garbage-coloected ŕÎéÁ (Component ˙éListener ŕé Component .ËË subscriber ËŔ ËÁß Ń ŹËË ÖÔÁ ˙ÁÎ Á ŕ ĹŔ ŕ ˙ÁÍ ŕ Ü ŢÁ ŕ ˙ĹŔ ŕ Ĺ áÍ Í ÜßÔ ËÍÁË ÍÁÍ ŢŔ ÍË ˙ÁÍ ŕ ˙Í ÁÍÎ Íé ééÍ ˙ÁÎ Á ŕ Listener ĹÍß ŕ ÁÍ Ëß ˙ÁÍ ÍÁ .ËÍÁË ˙ÁÎ Á Íéééé ÜË Ĺß ŕ ÍËß ÍßÔ ŕ ËÁß ˙ Ĺ ŢÁ ÍË) ŹË ˙éé ˙ééÁÍé Ĺß ŢÁ ÍË .ËŔ˙ Ń Ü (Ë ˙Í ÎßÍ ŕ Ë˙ Řéßé é ˙ÁÍ ĹÍßÁÍ ÍË Ëß Řß ˙ÁÎ Á ŕ ĹÁ Ë˙ .ËÎ˙ ÇÍ ÜË listener Ĺ ÎÁ ÁÍ Ëß ÝÍ ŢË ˙Ë .ŕŐ Ř ˙ß ˙ ĹÁ "loiterer" ÎÁ ˙ ĹŔ Öß ŢÁ ˙ÁÍé ŕ Document ĹŔ ŕ ĹÁ ŢÁ ËŔ ˙ Ń ˙ Ü ÍË Ü ŢÁ ŕ TextComponent ŕé Reference ŹËßÍ˙é Í ŕ name Ĺ ˙ÁÍ Ĺß ŕÍĚ .ËÍé ËéÁß ˙Í ÎßÍ ŕ ÁÍ ŕÔßÍ UIDelegate ÜË Ĺß Í .ËÍÁË Ëé é Úé Ëéé ŹËééÍ˙é ÎßÍ ŕ ÁÍ name ÍËß ÍßÔ ŕ employee ÍÁ ÁÍ PlainDocument ˙ ÍÎ ĹŔ ËÍ˙ ÜÍÁ ˙ÁÍ ŕ ÁÍ setText() .ËË Í JComponenet ÍË AncestorListener ÝÎé ÎÁ ŕË Á ÍßĚ Ü Í ŕÁÍ ŕé ÝéÁ ˙ÁÍé (´ľ Ôé) Ëßé Constructor ÍË ÝÎé ŢÁ ÎÁ Form .ĹÁ .Ë˙ ŕË Á (ÝÍ ŢË Řß Ý ÍË) ÍŐ ˙thread Form.java :´ Ĺ ˙Ă ß asserts ÎÁ Assert .Ýéé˙ ŕÁ ŕÍ ŕ ˙Ă ß assert Ĺ Ú Á ÍË ˙é .Ëß˙ ŕËË (6 ß 5 ˙Ĺ) Assert.java ÍË ŕ Ëß˙ Ü Đ ßË ŕééé éééééé ÍË ˙ÍééééééË ß ËÍÁË ÍÁÍééé com.holub.tools ŕé éé ÍË ŕéÁßé Üé Assert Ú ŕ ŕ ËÍÁË ÍÁÍ com.holub.tools.debug ÁÍ Ú Í ËÁß ˙ ÍÎ ĹÁÍß Ë ÎÁ ˙ ŢËÍ ŕÁ .ËËÍ˙ Ü ŹËß˙ :Ë ŕÁ Ëß ŕÍ ŕ
import com.holub.tools.debug.Assert; //debug version Üé ÍË ÁÍ non-debugging ˙Ë HotSpot ˙Î Ţ ŕ Ë ŕ ÁË ŕß ß ŕé éÍé ÍéŐ ÍË ÁÍ ˙ ˙Ë HotSpot ˙ .ËÎ˙ ŕ ŢÁ Ëé ÎÁ ÁÍ éÁ ŕ ÍË .ËÍÁË ˙ Í Č Á ˙ßÍÁ ŕÁ .Ë˙ ŘĚ ˙ ľ Ĺ ś Ĺ ŕÁÍ ¸ ß ˇ ˙Ĺ ŕ) ËÍ˙ ĹÍß ŮÍÔ Ţ ŕ Í ß ˙Ă ŕééé ŕé ËéË˙ Ń ˙ÎÔ ÁÍ ĹÍ D.ebug("Hello"); ÍÔ .(Ë .Ë ŕË import ŕÍ ŕ com.holub.tools.debug ˙ debug D.java :ˇ Ĺ ¸ Ĺ .Ë˙ ŕË š Ĺ ÍË ŕ ĹÁ Std Đ Ĺ ŢÍÁ š Ĺ áÍ ŕ ÍĚ ŘÔÁ ˙UI ËÁß ˙ ŕ ÝË Ţ ŕ Ý ŕ Áß ŕ ÝÍÁßËÁ get/set éÁßé ŕé Îéé ŢßË ß Ý ÍÎ Ţ Coupling ÜÁË ÁÍ ß Ĺéé ŕé Đé Ţé ˙ß coupling Ô ˙ÁÍ ÜÁßĎß áÍ ÍË .ËÎ ÎÁ ËééÁßé ˙ Î Á ÍË ˙ Á ËÍÁË Ëßß ËË˙ Ţ ÁÍ Ëß ˙ÁÍ .Ëé ŕË Á Ĺ Ń ˙ÁÍ JtextField ß Document ÍŐ ˙Đ ÝÍ˙ model ß docupling Źview ˙ MVC ˙Á ŘË ŕ áÍ ŢÁ ÍË ŕß éÝÍé .ËéŔ Ńéé ÜËé ŕé Ý ˙ Ë Ý ÍË ˙ ŕÁ ŢßË ŕ ŢÁ Í ŕß .Ë Í ŹËÍÁĚ Í ÜË Í ŕÁ ŢßË ËÁß ˙ ˙ßéé ŕ Î ŕÁ ŢßË Ëß˙ ÎÍ Ü Ú ÍË ÜË ÉÔ Đ ĹÁÍ .ËŔ˙ ÍË Ń ŕ ŢŔ ÍË Đ Ĺ ŕ Ë ˙ |
|
Resources The code in this article, along with an index of all the articles I've written for JavaWorld, can be found on my Web site, in the "Articles" section. http://www.holub.com Design patterns Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Addison-Wesley, 1995), is a cookbook documenting many patterns of object/class interaction that recur regularly in good object-oriented designs. All experienced object-oriented designers will recognize these patterns immediately from their own work, and folks who are learning object-oriented design can save themselves a lot of hard work by using the patterns described here from the beginning. Though any cookbook approach to design is ultimately limiting (to use a cookbook, you have to know how to cook), this book is invaluable to people learning the design process or wanting a common vocabulary to describe parts of their designs to other designers. It can save you an enormous amount of time: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0201633612&from=NCN454 Pattern Oriented Software Architecture: A System of Patterns, Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal (John Wiley & Sons, 1996 ) covers more or less the same ground as the Gang of Four book, but it covers some additional material as well. In particular, the Model/View/Controller and Presentation/Abstraction/Control architectures are discussed in depth: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471958697&from=NCN454 Object-Oriented Programming: An Evolutionary Approach, 2nd ed., Brad Cox and Andrew J. Novobilski (Addison-Wesley, 1994). Brad Cox first came up with the notion of a "pluggable component" (which he calls a "Software IC") in the context of the Objective C programming language. This book discusses both the Software IC and the language: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0201548348&from=NCN454 Patterns in Java, Vol. 1, Mark Grand (John Wiley & Sons, 1998), is essentially a rehashing of the Gang of Four book, but much more readable, and with examples in Java rather than C++. Grand does cover several patterns not covered by the Gang of Four, too: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471258393&from=NCN454 Patterns in Java, Vol. 2, Mark Grand (John Wiley & Sons, 1999), includes a very good chapter on UI design patterns, among others: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471258415&from=NCN454 Reuse "Flight 501 Failure Report," from the Inquiry Board of the European Space Agency, is an account of the launch and subsequent self destruction of the Ariane5 satellite booster. It's a great real-world example of why a "pluggable component" architecture is problematic in the real world: http://www.esrin.esa.it/htdocs/tidc/Press/Press96/ariane5rep.html UI design Usability Engineering, Jakob Nielsen (Morgan Kaufmann Publishers, 1993), is a good introduction to writing programs with usability in mind: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0125184069&from=NCN454 The Design of Everyday Things, (Doubleday, 1990), Donald A. Norman, obstensibly is about industrial design, but is really about good design in general. Using what he calls "user-centered design," Norman describes in detail why some designs are so frustrating to users and others are not. Norman talks in depth about how to work with people to end up with good designs for everything from faucets to computer programs. It's an amusing book that gives great advice about a serious subject: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0385267746&from=NCN454 "Interface Hall of Shame," (Isys Information Architects), is a great compendium of bad UI design. There's also a good UI hall of fame, but the bad UI section is more amusing. Though Microsoft, as usual, provides a rich set of examples of how not to do things, they are by no means the only entrants: http://www.iarchitect.com/mshame.htm Designing Visual Interfaces: Communication Oriented Techniques, Kevin Mullett and Darrell Sano (Prentice Hall, 1995), is essential reading for designers of data-entry systems. Particularly useful discussions of dialog layout, data-entry forms, and so on: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0133033899&from=NCN454 The Visual Display of Quantitative Information, Edward R. Tufte (Graphics Press, 1983), is a beautiful book that describes the "other side" of the U/I equation: how to present data to the user in the clearest possible way. Mullett describes the input side of the equation, Tufte the output side. Tufte's other books ({i Visual Explanations} and {i Envisioning Information}) are also worthwhile. About Face: The Essentials of User Interface Design, Alan Cooper (IDG Books, 1995). Ironically, the author of a great book about UI design is also the "father of Visual Basic," the tool responsible for many of the worst user interfaces ever foisted on the computing public. Cooper has a lot of opinions, some of which I agree with and some of which I don't. (In particular, I don't think of a program as a UI with intelligent warts hanging off of it, as Alan seems to do). Nonetheless, Cooper is always entertaining, and there's a lot of good advice here: http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=1568843224&from=NCN454 |
![]()
Copyright 2001-2002, IT World / Java World / PC WORLD Iran/ International Data Group Inc. All rights reserved.