/* Skuska z OOP, 26. maj 2009, otazka 18 Vhodne je pouzit vzor Visitor. Subory predstavuju prvky, kym sposoby sifrovania predstavuju navstevnikov. Zahrnute su len veci tykajuce sa sifrovania. Predpokladajme, ze sa sifrovane subory ulozia na disk s nazvom podla konvencie, co nie je predmetom otazky. Bolo potrebne aj vysvetlit ako toto riesenie zjednodusuje ocakavane rozsirenie aplikacie. Desifrovanie nebolo pri hodnotenie brane ako zavazne. Hierarchia dedenia bola hodnotena flexibilne. Hierarchia predlozea v tomto rieseni zohladnuje aj jestvovanie spolocnych veci mimo sifrovania, avsak ako sifrovatelne oznacuje len tie typy na spodku hierarchie. Tak sa napriklad nevnucuje implementacia sifrovania vsetkym textovym suborom. Uvedene typy patria do jedneho balika. Kazdy typ by mal byt vo vlastnom subore. */ public interface Encodable { void encode(Encoding e); void decode(Encoding e); } public interface Encoding { void encodeFile(BinaryFile f); void encodeFile(ASCIIFile f); void encodeFile(UnicodeFile f); void decodeFile(BinaryFile f); void decodeFile(ASCIIFile f); void decodeFile(UnicodeFile f); } public abstract class AFile { // ... } public class BinaryFile extends AFile implements Encodable { // ... public void encode(Encoding e){ e.encodeFile(this); } public void decode(Encoding e){ e.encodeFile(this); } // ... } public abstract class TextFile extends AFile { // ... } public class ASCIIFile extends TextFile implements Encodable { // ... public void encode(Encoding e){ e.encodeFile(this); } public void decode(Encoding e){ e.encodeFile(this); } // ... } public class UnicodeFile extends TextFile implements Encodable { // ... public void encode(Encoding e){ e.encodeFile(this); } public void decode(Encoding e){ e.encodeFile(this); } // ... } public class OneEncoding implements Encoding { // ... public void encodeFile(BinaryFile f){ // ... } public void encodeFile(ASCIIFile f){ // ... } public void encodeFile(UnicodeFile f){ // ... } public void decodeFile(BinaryFile f){ // ... } public void decodeFile(ASCIIFile f){ // ... } public void decodeFile(UnicodeFile f){ // ... } // ... } public class AnoterEncoding implements Encoding { // ... public void encodeFile(BinaryFile f){ // ... } public void encodeFile(ASCIIFile f){ // ... } public void encodeFile(UnicodeFile f){ // ... } public void decodeFile(BinaryFile f){ // ... } public void decodeFile(ASCIIFile f){ // ... } public void decodeFile(UnicodeFile f){ // ... } // ... } // Priklad pouzitia: Encoding e = new OneEncoding(); Encodable[] file; // naplnime pole suborov for (Encodable f : file) // sifrovanie vsetkych dodanych suborov f.encode(e);